導入
PHPで配列を結合するための方法は幾らかありますが、それぞれ微妙に挙動が異なるので、ここでは違いが分かりやすいようにまとめてみます。
比較
早見表
array_merge
やarray_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;
}