配列のマージには、array_merge() 以外に、'...' を使った方法もあります。
それは数値の配列キーにしか対応してなかったんですが、PHP8.1から文字列のキーも使えるようになりました。
この配列のマージのことを『配列のアンパック』と言います。また一般的にはスプレッド構文・スプレッド演算子と呼ばれる。
配列のアンパックの基本については、PHP7.4のところで触れたのでここでは割愛します。
PHP7.4からPHP8.0までは、連想配列のキーが文字列のときPHPエラーが発生していました。
$org = ['a' => '1st', 'b' => '2nd', 'c' => '3rd'];
$new = ['d' => '4th', 'e' => '5th', 'f' => '6th'];
$unpack = [...$org, ...$new];
var_dump($unpack);
PHP8.0の実行結果
PHP Fatal error: Uncaught Error: Cannot unpack array with string keys in /home/vagrant/php-test.php:4
Stack trace:
#0 {main}
thrown in /home/vagrant/php-test.php on line 4
これがPHP8.1ではarray_merg()と同じ結果になります。
PHP8.1の実行結果
array(6) {
["a"]=>
string(3) "1st"
["b"]=>
string(3) "2nd"
["c"]=>
string(3) "3rd"
["d"]=>
string(3) "4th"
["e"]=>
string(3) "5th"
["f"]=>
string(3) "6th"
}
配列のキーが被ったときどうなるか見てみましょう。
$org = ['a' => '1st', 'b' => '2nd', 'c' => '3rd'];
$new = ['c' => '4th', 'd' => '5th', 'e' => '6th'];
$unpack = [...$org, ...$new];
var_dump($unpack);
array(5) {
["a"]=>
string(3) "1st"
["b"]=>
string(3) "2nd"
["c"]=>
string(3) "4th"
["d"]=>
string(3) "5th"
["e"]=>
string(3) "6th"
}
キーが被ったときはあとから追加されたもので上書きされます。
変更点のあるものだけを変えるのがマージというので当然のこと。もちろん、array_merge() も同じ結果になります。
PHP8.1以降、array_merge() とアンパックは全く同じ機能
PHP8.1で変更点が加えられたことで、アンパックとarray_merge() の処理でできることは全く同じになりました。
これでarray_merge()はお役御免なんじゃないだろうか。
個人的にはアンパックだけでいいと思う。コードの見た目もマージしてますって感じだし。
じつはPHP8.1のarray_merge()の中身って、アンパック1行だけかもしれない。パラメータうんぬんの処理を除くと。
PHP公式ドキュメント