[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]
となった。
$hoge2
とarray( '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()
は、実行するたびに速度が不安定なようだ...そして、速度を気にするなら使わない方が良さそうだ