Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
59
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

導入

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;
}
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
59
Help us understand the problem. What are the problem?