Help us understand the problem. What is going on with this article?

配列結合演算子, 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;
}
mpyw
古い記事はそのまま参考にしないようにご注意ください
synapse
Synapseは、オンラインサロンサービスにおけるパイオニアとして、かつて存在していたスタートアップです。
https://synapseam.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away