array_replace_recursive 機能をトレースしてみた
-
- array_replace
- array_replace_recursive
が php5.3.0 以上じゃないと使えないので機能をトレースしてみた。
ちなみに上の関数は第一引数で与えられた配列内の要素を第2引数以降与えられたもので、置換していく関数。
array_merge() とか array_merge_recursive() は先頭に詰めていってしまうので少し効果が違ってくる。
function trace_replace_recursive( $base = array() ) { $len_arg = func_num_args(); if ( !is_array($base) ) return array(); if ( $len_arg < 2 ) return $base; $args = func_get_args(); for ($i = 1; $i < $len_arg; $i++) { $tmp_arg = $args[$i]; if ( !is_array($tmp_arg) ) continue; foreach ( $tmp_arg as $k => $v ) { if( is_array($v) ){ if( !isset( $base[$k] ) ) $base[$k] = array(); $base[ $k ] = trace_replace_recursive($base[$k], $v); } else $base[$k] = $v; } } return $base; }
で
$arr1[1][2] = 5; $arr2[2][2] = 3; $arr3[1][3] = 2; $arr4[1][4][1] = 4;
な配列をそれぞれ突っ込んでみた結果。
- php5.3.2
array_replace_recursive(array(), $arr1, $arr2, $arr3, $arr4); array(2) { [1]=>array(3) { [2]=>int(5) [3]=>int(2) [4]=>array(1) { [1]=>int(4) } } [2]=>array(1) { [2]=>int(3) } }
- php5.2.6
trace_replace_recursive(array(), $arr1, $arr2, $arr3, $arr4); array(2) { [1]=>array(3) { [2]=>int(5) [3]=>int(2) [4]=>array(1) { [1]=>int(4) } } [2]=>array(1) { [2]=>int(3) } }
ざっくり希望通り動作したー。
こういう関数がデフォで入ってるのはほんと便利だなぁ(´・ω・`)
・・・と、ふとphp.ne の array_replace_recursive の項目を見てたら・・・
すでに機能をトレースするコードがコメントにあるというねorz
これから見比べてみる。
http://www.php.net/manual/ja/function.array-replace-recursive.php
いい勉強になったとしておきますorz