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