[PHP] 配列に要素を追加する方法と速度

PHP高速化


array()に要素を追加する方法はいろいろとあるが、結果が同じでも速度が違う。そして、array_なんちゃら系の関数は遅いことが多い。
配列に要素を追加する、または配列に配列を追加する方法と、その速度計測をメモ。

実行環境:paiza.io PHP 7.2.12

$array[]

配列に一つだけ要素を追加することができる
書き方:$array[] = 追加する要素

[]が空の場合、0,1,2…のように番号がキーとなる。
['id']とか['name']のように何かが入っている場合、それがキーの名前となる


$hoge = array(99 => "その他");
$hoge[] = "ルビー";
$hoge[] = "パール";
$hoge["j"] = "指輪";
var_dump($hoge);
結果
array(4) {
  [99]=>
  string(9) "その他"
  [100]=>
  string(9) "ルビー"
  [101]=>
  string(9) "パール"
  ["j"]=>
  string(6) "指輪"
}

キーを99指定からスタートして、その後の要素のキーを指定しないと、100,101….と続く

array_push()

配列の最後に要素を追加することができる

書き方:array_push( 追加する配列 , 追加する要素1 [, 追加する要素2 ] )

第二引数以下に、追加したい数だけ要素を書くことができる。
追加する要素にキーを指定することはできない

公式ドキュメントにもあるが、追加する要素数が少ない場合には、$array[] =を使った方が速い。

注意: もし配列にひとつの要素を加えるために array_push() を使用するなら、 関数を呼ぶオーバーヘッドがないので、$array[] = を使用するほうがいいです。
$hoge = array("サラダ");
array_push($hoge,"ピザ", "サンドウィッチ");
var_dump($hoge);
結果
array(3) {
  [0]=>
  string(9) "サラダ"
  [1]=>
  string(6) "ピザ"
  [2]=>
  string(21) "サンドウィッチ"
}

かなり遅い。と評判なので、自分的に使わない方がいい関数の1つ。
なんどか、$array[]と比較し計測したけど、すっごい遅いときと、たいして変わらない時がある。(最後の章参照)

array_merge()

ここからは、配列に要素を追加ではなく、配列に配列を追加する関数


配列と配列を連結する関数。
書き方:array_merge( 連結する配列 [, 連結する配列2... ] )

第二引数以下に、追加したい数だけ配列を書くことができる。

戻り値は、連結した配列であり、元の配列に影響はない。
連結する配列のキーが数字であった場合、連結後の配列のキーは、ゼロから始まる新たな連続した数字となる


$hoge1 = array(99 => "その他");
$hoge2 = array('bbb'=>'イベリコ豚', 'ccc'=>'ミニブタ');
$hoge = array_merge($hoge1,$hoge2,array('うさぎ'),array( 'ccc'=>'ごりら'));
var_dump($hoge);
結果
array(4) {
  [0]=>
  string(9) "その他"
  ["bbb"]=>
  string(15) "イベリコ豚"
  ["ccc"]=>
  string(9) "ごりら"
  [1]=>
  string(9) "うさぎ"
}

array(99 => "その他")は、キーが数値だったため、新たな配列ではキー[0]となった。

$hoge2array( 'ccc'=>'ごりら')は、キー「'ccc'」が重複しているため、連結後の配列では「'ごりら'」に上書きされた

+演算子

配列に配列を追加することができる
書き方:連結後配列 = 追加する配列1 + 追加する配列2 or 追加する配列1 += 追加する配列2

$hoge = array(99 => "その他");
$hoge1 = array('東京'=>'東京理科大学');
$hoge = $hoge + $hoge1;
$hoge = $hoge + array('東京'=>'東京大学') + array('京都'=>'京都大学');
//これでもOK
$hoge += array('千葉'=>'千葉大学','私立大学');
var_dump($hoge);
結果
array(5) {
  [99]=>
  string(9) "その他"
  ["東京"]=>
  string(18) "東京理科大学"
  ["京都"]=>
  string(12) "京都大学"
  ["千葉"]=>
  string(12) "千葉大学"
  [0]=>
  string(12) "私立大学"
}

array_merge()とは異なりキーが重複した場合、上書きしない。
ここでは、キー["東京"]が重複しているが、最初に連結済みの「'東京'=>'東京理科大学'」の値が残り、「'東京'=>'東京大学'」の値は反映されない。

array_merge()と異なり、追加する配列のキーに数字を使っても連結後のキーに反映される(0から振り直しにはならない)

$array[]array_push()の速度比較

paiza.ioで計測した。

$time_start = microtime(true);
$array = array();
for ($i = 0; $i < 1000000; $i++) {
    $array[] = 'hogehogehoge'.$i;
}
$time = microtime(true) - $time_start;
echo "{$time} 秒";
結果

1回目:0.093322992324829 秒
2回目:0.093210935592651 秒
3回目:0.093033075332642 秒


$time_start = microtime(true);
$array = array();
for ($i = 0; $i < 1000000; $i++) {
    array_push($array,'hogehogehoge'.$i);
}
$time = microtime(true) - $time_start;
echo "{$time} 秒";
結果

1回目:1.6916961669922 秒
2回目:0.1149320602417 秒
3回目:0.46308612823486 秒

array_push()は、実行するたびに速度が不安定なようだ...そして、速度を気にするなら使わない方が良さそうだ

Posted by Agopeanuts