(PHP4)配列Aに配列Bの要素を一気にpushしたい

なんだかんだ言っても最近はPHPの仕事してるのでPHPの話が多くなるね。うん。しょうがない。

ある配列にある配列の要素をpushしたいと思って何気なく、

 $array_a = array('a','b');
 $array_b = array('c','d');
 array_push($array_a,$array_b);
 print_r($array_a);

とかやったら、$array_a = array('a','b','c','d') ってなるのを期待してたのに、

 Array
 (
     [0] => a
     [1] => b
     [2] => Array
         (
             [0] => c
             [1] => d
         )
 )

こんなんなっちゃった。
そかーarray_pushって第二引数で指定された値をそのままpushしちゃうのね。
じゃあどうすんの?って思ってとりあえず標準関数にarray_push_arrayみたいなのが無かったっぽいので方法を考えてみる。

  • array_mergeを使う方法
 $array_a = array_merge($array_a,$array_b);
  • foreachを使う方法
 foreach ( $array_b as $val ) {
     $array_a[] = $val;
 }
  • array_spliceを使う方法
 array_splice($array_a,count($array_a),0,$array_b);

さてどれがいいんだろうか。
array_mergeはマージするのが本来の目的じゃないから微妙。後ろに追加したいだけなのに$array_aを展開してまた代入するのが無駄っぽい。

まぁ、foreachが無難なとこかなぁ。ただリファレンス維持したければ

 foreach ( $array_b as $i => $dummy ) {
     $array_a[] =& $array_b[$i];
 }

としないといけないので注意が必要ですが。

array_splice使う方法は個人的にはスパっと一行で書けるし好きなんだけど若干可読性悪いよね。

というわけで軽くベンチ

 require_once "Benchmark/Iterate.php";
 function array1 ($str) {
     $arraya = range(0,100);
     $arrayb = range(0,100);
     $arraya = array_merge($arraya,$arrayb);
 }
 function array2 ($str) {
     $arraya = range(0,100);
     $arrayb = range(0,100);
     foreach ( $arrayb as $val ) {
         $arraya[] = $val;
     }
 }
 function array3 ($str) {
     $arraya = range(0,100);
     $arrayb = range(0,100);
     array_splice($arraya,count($arraya),0,$arrayb);
 }
 $counter =  1000;
 $bench   =& new Benchmark_Iterate;
 $bench->run($counter,'array1',''); $result1 = $bench->get();
 $bench->run($counter,'array2',''); $result2 = $bench->get();
 $bench->run($counter,'array3',''); $result3 = $bench->get();
 print('array_merge  -> '.$result1['mean'] . "\n");
 print('foreach      -> '.$result2['mean'] . "\n");
 print('array_splice -> '.$result3['mean'] . "\n");
 

結果はこんな感じ。

 array_merge  -> 0.000419
 foreach      -> 0.000277
 array_splice -> 0.000251

よし!array_spliceに決めた!