導入
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;
}