PHP

配列結合演算子, array_merge, array_replace を徹底比較

More than 3 years have passed since last update.


導入

PHPで配列を結合するための方法は幾らかありますが、それぞれ微妙に挙動が異なるので、ここでは違いが分かりやすいようにまとめてみます。


比較


早見表

array_mergearray_merge_recursiveの挙動にはかなりクセがあるのでご注意を。

手段 \ キー
未定義整数
未定義文字列
重複整数
重複文字列

配列結合演算子 +
追加
追加
無視
無視

array_merge
連番に直して追加
追加
連番に直して追加
上書き

array_replace
追加
追加
上書き
上書き

array_merge_recursive
連番に直して追加
追加
連番に直して追加
可能な場所まで相互に再帰

双方を配列にキャスト

array_mergeを用いて結合

array_replace_recursive
追加
追加
可能な場所まで相互に再帰

上書き
可能な場所まで相互に再帰

上書き


PHP関数としての表現

自信があまり無いので間違い等ありましたらご指摘ください。


配列結合演算子 +

function plus(array $base, array $another) {

foreach ($another as $key => $value) {
if (!array_key_exists($key, $base)) {
$base[$key] = $value;
}
}
return $base;
}


array_merge

function array_merge(array $base, array ...$others) {

foreach ($others as $other) {
foreach ($other as $key => $value) {
if (is_int($key)) {
$base[] = $value;
} else {
$base[$key] = $value;
}
}
}
return $base;
}


array_replace

function array_replace(array $base, array ...$others) {

foreach ($others as $other) {
foreach ($other as $key => $value) {
$base[$key] = $value;
}
}
return $base;
}


array_merge_recursive

function array_merge_recursive(array $base, array ...$others) {

foreach ($others as $other) {
foreach ($other as $key => $value) {
if (is_int($key)) {
$base[] = $value;
} elseif (array_key_exists($key, $base)) {
if (is_array($base[$key]) && is_array($value)) {
$base[$key] = array_merge_recursive($base[$key], $value);
} else {
$base[$key] = array_merge((array)$base[$key], (array)$value);
}
} else {
$base[$key] = $value;
}
}
}
return $base;
}


array_replace_recursive

function array_replace_recursive(array $base, array ...$others) {

foreach ($others as $other) {
foreach ($other as $key => $value) {
if (array_key_exists($key, $base) && is_array($base[$key]) && is_array($value)) {
$base[$key] = array_replace_recursive($base[$key], $value);
} else {
$base[$key] = $value;
}
}
}
return $base;
}