array_merge()
を連想配列で使用すると、必要なものが得られますが、数値キー配列で使用すると、キーが変更されます。
+
キーは保持されますが、連想配列では機能しません。
私はこれがどのように機能するか理解していません、誰かが私にそれを説明できますか?
両方の配列には数値インデックスが付けられているため、最初の配列の値のみが使用されます。
+演算子は、左側の配列に追加された右側の配列を返します。 両方の配列に存在するキーの場合、左側の配列の要素が使用され、右側の配列の一致する要素は無視されます。
http://php.net/manual/en/language.operators.array.php
array_merge()
の動作はわずかに異なります。
入力配列に同じ文字列キーがある場合、そのキーの新しい値が前の値を上書きします。 ただし、配列に数値キーが含まれている場合、後の値は元の値を上書きせずに追加されます。数値キーのある入力配列の値は、結果配列のゼロから始まる増分キーで番号が付け直されます。
これら2つの操作はまったく異なります。
配列プラス
- 配列プラス演算は、すべての配列を連想配列として扱います。
- プラス中にキーが競合する場合、left(previous)値が保持されます
null + array()
は致命的なエラーを発生させますarray_merge()
- array_merge()は、index-arrayとassoc-arrayで動作が異なります。
- 両方のパラメーターがインデックス配列の場合、array_merge()はインデックス配列値を連結します。
- そうでない場合、インデックス配列は値配列に変換してから、連想配列に変換します。
- これで、2つのassoc配列を取得し、それらをマージします。キーが競合する場合、right(last)値が保持されます。
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;
}