web-dev-qa-db-ja.com

Array_merge対+

array_merge()を連想配列で使用すると、必要なものが得られますが、数値キー配列で使用すると、キーが変更されます。

+キーは保持されますが、連想配列では機能しません。

私はこれがどのように機能するか理解していません、誰かが私にそれを説明できますか?

108
Elly

両方の配列には数値インデックスが付けられているため、最初の配列の値のみが使用されます。

+演算子は、左側の配列に追加された右側の配列を返します。 両方の配列に存在するキーの場合、左側の配列の要素が使用され、右側の配列の一致する要素は無視されます。

http://php.net/manual/en/language.operators.array.php

array_merge()の動作はわずかに異なります。

入力配列に同じ文字列キーがある場合、そのキーの新しい値が前の値を上書きします。 ただし、配列に数値キーが含まれている場合、後の値は元の値を上書きせずに追加されます。数値キーのある入力配列の値は、結果配列のゼロから始まる増分キーで番号が付け直されます。

http://php.net/manual/en/function.array-merge.php

140

これら2つの操作はまったく異なります。

配列プラス

  1. 配列プラス演算は、すべての配列を連想配列として扱います。
  2. プラス中にキーが競合する場合、left(previous)値が保持されます
  3. null + array()は致命的なエラーを発生させます

array_merge()

  1. array_merge()は、index-arrayとassoc-arrayで動作が異なります。
  2. 両方のパラメーターがインデックス配列の場合、array_merge()はインデックス配列値を連結します。
  3. そうでない場合、インデックス配列は値配列に変換してから、連想配列に変換します。
  4. これで、2つのassoc配列を取得し、それらをマージします。キーが競合する場合、right(last)値が保持されます。
  5. array_merge(null, array())はarray()を返し、パラメーター#1は配列ではないという警告を受け取りました。

わかりやすくするために、以下のコードを投稿します。

function array_plus($a, $b){
    $results = array();
    foreach($a as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    foreach($b as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    return $results;
}

//----------------------------------------------------------------

function is_index($a){
    $keys = array_keys($a);
    foreach($keys as $key) {
        $i = intval($key);
        if("$key"!="$i") return false;
    }
    return true;
}

function array_merge($a, $b){
    if(is_index($a)) $a = array_values($a);
    if(is_index($b)) $b = array_values($b);
    $results = array();
    if(is_index($a) and is_index($b)){
        foreach($a as $v) $results[] = $v;
        foreach($b as $v) $results[] = $v;
    }
    else{
        foreach($a as $k=>$v) $results[$k] = $v;
        foreach($b as $k=>$v) $results[$k] = $v;
    }
    return $results;
}
27
Gucci Koo