配列の結合を仕様としたところ、phpの関数では意図した結合が出来ない場合があります。
下記のような配列を結合しようとした場合
array_merge_recursive()関数を利用すると、既にキーに値が入っている場合、値が追加されてしまいます。
ということで、いろいろ調べているとcakeフレームワークで使えそうな関数が出てきたので、拝借しました。
http://book.cakephp.org/ja/compare/679/merge
この関数は PHP の array_merge と array_merge_recursive を混ぜ合わせたものと見なすことができます。 array_merge と異なる点は、もし配列のキーが他の配列に含まれていたら、再帰的に振舞うことです。
--------------------------------------------------
結合もとデータ
--------------------------------------------------
Array
(
[pc] => Array
(
[layout] => Array
(
[file] => secondtopDefault
)
[css] => Array
(
[file] => secondtop
)
[js] => Array
(
[file] => Array
(
[0] => scroll
[1] => rollover
)
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtop
)
[menu] => Array
(
[file] => secondtop
)
[subContents1] => Array
(
[file] => index
)
)
[mobile] => Array
(
[layout] => Array
(
[file] =>
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtopTop
)
[menu] => Array
(
[file] => secondtopTop
)
[css] => Array
(
[file] =>
)
[subContents1] => Array
(
[file] =>
)
)
)
--------------------------------------------------
結合データ
--------------------------------------------------
Array
(
[pc] => Array
(
[layout] => Array
(
[file] => default
)
)
)
--------------------------------------------------
マージ array_merge_recursive()
--------------------------------------------------
Array
(
[pc] => Array
(
[layout] => Array
(
[file] => Array
(
[0] => secondtopDefault
[1] => default
←ここがうざい。。 )
)
[css] => Array
(
[file] => secondtop
)
[js] => Array
(
[file] => Array
(
[0] => scroll
[1] => rollover
)
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtop
)
[menu] => Array
(
[file] => secondtop
)
[subContents1] => Array
(
[file] => index
)
)
[mobile] => Array
(
[layout] => Array
(
[file] =>
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtopTop
)
[menu] => Array
(
[file] => secondtopTop
)
[css] => Array
(
[file] =>
)
[subContents1] => Array
(
[file] =>
)
)
)
--------------------------------------------------
マージ(cakeSet::merge)
--------------------------------------------------
Array
(
[pc] => Array
(
[layout] => Array
(
[file] => default
)
[css] => Array
(
[file] => secondtop
)
[js] => Array
(
[file] => Array
(
[0] => scroll
[1] => rollover
)
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtop
)
[menu] => Array
(
[file] => secondtop
)
[subContents1] => Array
(
[file] => index
)
)
[mobile] => Array
(
[layout] => Array
(
[file] =>
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtopTop
)
[menu] => Array
(
[file] => secondtopTop
)
[css] => Array
(
[file] =>
)
[subContents1] => Array
(
[file] =>
)
)
)
■参考
--------------------------------------------------
+結合
--------------------------------------------------
Array
(
[pc] => Array
(
[layout] => Array
(
[file] => secondtopDefault
)
[css] => Array
(
[file] => secondtop
)
[js] => Array
(
[file] => Array
(
[0] => scroll
[1] => rollover
)
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtop
)
[menu] => Array
(
[file] => secondtop
)
[subContents1] => Array
(
[file] => index
)
)
[mobile] => Array
(
[layout] => Array
(
[file] =>
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtopTop
)
[menu] => Array
(
[file] => secondtopTop
)
[css] => Array
(
[file] =>
)
[subContents1] => Array
(
[file] =>
)
)
)
■99%借り物のソースですが。。
class cakeSet{
/**
* Deprecated
*
*/
var $value = array();
/**
* This function can be thought of as a hybrid between PHP's array_merge and array_merge_recursive. The difference
* to the two is that if an array key contains another array then the function behaves recursive (unlike array_merge)
* but does not do if for keys containing strings (unlike array_merge_recursive). See the unit test for more information.
*
* Note: This function will work with an unlimited amount of arguments and typecasts non-array parameters into arrays.
*
* @param array $arr1 Array to be merged
* @param array $arr2 Array to merge with
* @return array Merged array
* @access public
* @static
*/
static function merge($arr1, $arr2 = null) {
$args = func_get_args();
$r = (array)current($args);
while (($arg = next($args)) !== false) {
foreach ((array)$arg as $key => $val) {
if (is_array($val) && isset($r[$key]) && is_array($r[$key])) {
$r[$key] = cakeSet::merge($r[$key], $val);
} elseif (is_int($key)) {
$r[] = $val;
} else {
$r[$key] = $val;
}
}
}
return $r;
}
}
?>
下記のような配列を結合しようとした場合
array_merge_recursive()関数を利用すると、既にキーに値が入っている場合、値が追加されてしまいます。
ということで、いろいろ調べているとcakeフレームワークで使えそうな関数が出てきたので、拝借しました。
http://book.cakephp.org/ja/compare/679/merge
この関数は PHP の array_merge と array_merge_recursive を混ぜ合わせたものと見なすことができます。 array_merge と異なる点は、もし配列のキーが他の配列に含まれていたら、再帰的に振舞うことです。
--------------------------------------------------
結合もとデータ
--------------------------------------------------
Array
(
[pc] => Array
(
[layout] => Array
(
[file] => secondtopDefault
)
[css] => Array
(
[file] => secondtop
)
[js] => Array
(
[file] => Array
(
[0] => scroll
[1] => rollover
)
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtop
)
[menu] => Array
(
[file] => secondtop
)
[subContents1] => Array
(
[file] => index
)
)
[mobile] => Array
(
[layout] => Array
(
[file] =>
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtopTop
)
[menu] => Array
(
[file] => secondtopTop
)
[css] => Array
(
[file] =>
)
[subContents1] => Array
(
[file] =>
)
)
)
--------------------------------------------------
結合データ
--------------------------------------------------
Array
(
[pc] => Array
(
[layout] => Array
(
[file] => default
)
)
)
--------------------------------------------------
マージ array_merge_recursive()
--------------------------------------------------
Array
(
[pc] => Array
(
[layout] => Array
(
[file] => Array
(
[0] => secondtopDefault
[1] => default
←ここがうざい。。 )
)
[css] => Array
(
[file] => secondtop
)
[js] => Array
(
[file] => Array
(
[0] => scroll
[1] => rollover
)
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtop
)
[menu] => Array
(
[file] => secondtop
)
[subContents1] => Array
(
[file] => index
)
)
[mobile] => Array
(
[layout] => Array
(
[file] =>
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtopTop
)
[menu] => Array
(
[file] => secondtopTop
)
[css] => Array
(
[file] =>
)
[subContents1] => Array
(
[file] =>
)
)
)
--------------------------------------------------
マージ(cakeSet::merge)
--------------------------------------------------
Array
(
[pc] => Array
(
[layout] => Array
(
[file] => default
)
[css] => Array
(
[file] => secondtop
)
[js] => Array
(
[file] => Array
(
[0] => scroll
[1] => rollover
)
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtop
)
[menu] => Array
(
[file] => secondtop
)
[subContents1] => Array
(
[file] => index
)
)
[mobile] => Array
(
[layout] => Array
(
[file] =>
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtopTop
)
[menu] => Array
(
[file] => secondtopTop
)
[css] => Array
(
[file] =>
)
[subContents1] => Array
(
[file] =>
)
)
)
■参考
--------------------------------------------------
+結合
--------------------------------------------------
Array
(
[pc] => Array
(
[layout] => Array
(
[file] => secondtopDefault
)
[css] => Array
(
[file] => secondtop
)
[js] => Array
(
[file] => Array
(
[0] => scroll
[1] => rollover
)
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtop
)
[menu] => Array
(
[file] => secondtop
)
[subContents1] => Array
(
[file] => index
)
)
[mobile] => Array
(
[layout] => Array
(
[file] =>
)
[header] => Array
(
[file] => secondtopContents
)
[footer] => Array
(
[file] => secondtopTop
)
[menu] => Array
(
[file] => secondtopTop
)
[css] => Array
(
[file] =>
)
[subContents1] => Array
(
[file] =>
)
)
)
■99%借り物のソースですが。。
class cakeSet{
/**
* Deprecated
*
*/
var $value = array();
/**
* This function can be thought of as a hybrid between PHP's array_merge and array_merge_recursive. The difference
* to the two is that if an array key contains another array then the function behaves recursive (unlike array_merge)
* but does not do if for keys containing strings (unlike array_merge_recursive). See the unit test for more information.
*
* Note: This function will work with an unlimited amount of arguments and typecasts non-array parameters into arrays.
*
* @param array $arr1 Array to be merged
* @param array $arr2 Array to merge with
* @return array Merged array
* @access public
* @static
*/
static function merge($arr1, $arr2 = null) {
$args = func_get_args();
$r = (array)current($args);
while (($arg = next($args)) !== false) {
foreach ((array)$arg as $key => $val) {
if (is_array($val) && isset($r[$key]) && is_array($r[$key])) {
$r[$key] = cakeSet::merge($r[$key], $val);
} elseif (is_int($key)) {
$r[] = $val;
} else {
$r[$key] = $val;
}
}
}
return $r;
}
}
?>
