129

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

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

これがどのように機能するのかわかりませんが、誰かが私にそれを説明できますか?

4

2 に答える 2

173

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

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

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

array_merge()動作が少し異なります:

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

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

于 2011-08-14T21:09:02.433 に答える
35

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

アレイプラス

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

array_merge()

  1. array_merge()は、index-arrayとassoc-arrayでは動作が異なります。
  2. 両方のパラメーターがindex-arrayの場合、array_merge()はindex-array値を連結します。
  3. そうでない場合、index-arrayはvalues配列に変換してから、assoc配列に変換します。
  4. これで、2つの連想配列が取得され、それらがマージされます。キーが競合する場合、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;
}
于 2014-12-31T07:33:59.367 に答える