$test = array('hi');
$test += array('test','oh');
var_dump($test);
+
PHPの配列はどういう意味ですか?
array_merge
か?これは、配列がデフォルトで連想配列であり、数値配列が第2クラスのシチズンであるかのようです。
$test = array('hi');
$test += array('test','oh');
var_dump($test);
+
PHPの配列はどういう意味ですか?
array_merge
か?これは、配列がデフォルトで連想配列であり、数値配列が第2クラスのシチズンであるかのようです。
回答:
言語演算子に関するPHPマニュアルからの引用
+演算子は、左側の配列に追加された右側の配列を返します。両方の配列に存在するキーの場合、左側の配列の要素が使用され、右側の配列の一致する要素は無視されます。
だからあなたがするなら
$array1 = ['one', 'two', 'foo' => 'bar'];
$array2 = ['three', 'four', 'five', 'foo' => 'baz'];
print_r($array1 + $array2);
あなたが得るでしょう
Array
(
[0] => one // preserved from $array1 (left-hand array)
[1] => two // preserved from $array1 (left-hand array)
[foo] => bar // preserved from $array1 (left-hand array)
[2] => five // added from $array2 (right-hand array)
)
したがって、のロジックは+
次のスニペットと同等です。
$union = $array1;
foreach ($array2 as $key => $value) {
if (false === array_key_exists($key, $union)) {
$union[$key] = $value;
}
}
Cレベルの実装の詳細に興味がある場合は、
これ+
はarray_merge()
、配列を組み合わせる方法とは異なります。
print_r(array_merge($array1, $array2));
あなたを与えるだろう
Array
(
[0] => one // preserved from $array1
[1] => two // preserved from $array1
[foo] => baz // overwritten from $array2
[2] => three // appended from $array2
[3] => four // appended from $array2
[4] => five // appended from $array2
)
その他の例については、リンク先のページを参照してください。
+
との両方が内部でarray_merge
呼び出さzend_hash_merge
れます。PHPでは配列が順序付けされたハッシュマップとして実装されているため、これも予想されます。
+
とarray_merge
あまのじゃくと直感的です。これらは、平易な英語の読みが配列を「追加」または「マージ」することで直感的にわかることとは逆の方法です。他の言語/ライブラリは+
、リストを連結(例:Python)し、ある関数から別のオブジェクト(例:ロダッシュ)にキーと値のペアを追加する「マージ」関数を使用します。しかし、PHPではその逆です。array_merge
リストのような配列の連結に使用できますが、使用+
できません。とは異なりarray_merge
、 +
他の言語では「マージ」と呼ばれる操作を常に実行します。
これを使用するために見つけた最良の例は、構成配列にあります。
$user_vars = array("username"=>"John Doe");
$default_vars = array("username"=>"Unknown", "email"=>"no-reply@domain.com");
$config = $user_vars + $default_vars;
が$default_vars
示唆するように、はデフォルト値の配列です。$user_vars
アレイは、で定義された値を上書きします$default_vars
。で欠落している値は、$user_vars
からのデフォルトの変数になり$default_vars
ます。
これは次のprint_r
ようになります:
Array(2){
"username" => "John Doe",
"email" => "no-reply@domain.com"
}
これが役に立てば幸いです!
この演算子は、2つの配列の和集合を取ります(array_mergeと重複するキーが上書きされることを除いて、array_mergeと同じです)。
配列演算子のドキュメントはここにあります。
テンキーを保持する必要がある場合、または何かを失いたくない場合は、テンキーに注意してください。
$a = array(2 => "a2", 4 => "a4", 5 => "a5");
$b = array(1 => "b1", 3 => "b3", 4 => "b4");
連合
print_r($a+$b);
Array
(
[2] => a2
[4] => a4
[5] => a5
[1] => b1
[3] => b3
)
マージ
print_r(array_merge($a, $b));
Array
(
[0] => a2
[1] => a4
[2] => a5
[3] => b1
[4] => b3
[5] => b4
)
+
オペレータは、同じ結果を生成)(array_replace。ただし、演算子の引数が逆になっているため、結果の配列の順序も異なる場合があります。
このページの別の例を展開します。
$array1 = array('one', 'two', 'foo' => 'bar');
$array2 = array('three', 'four', 'five', 'foo' => 'baz');
print_r($array1 + $array2);
print_r(array_replace($array2, $array1)); //note reversed argument order
出力:
Array
(
[0] => one // preserved from $array1
[1] => two // preserved from $array1
[foo] => bar // preserved from $array1
[2] => five // added from $array2
)
Array
(
[0] => one // preserved from $array1
[1] => two // preserved from $array1
[2] => five // added from $array2
[foo] => bar // preserved from $array1
)
+
仕様によって保証されていますか?どうarray_replace
ですか?
- 配列プラス操作は、すべての配列を連想配列として扱います。
- プラス中にキーが競合すると、左(前の)値が保持されます
わかりやすくするために、以下のコードを投稿します。
$a + $b = array_plus($a, $b)
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;
}
$var1 = "example";
$var2 = "test";
$output = array_merge((array)$var1,(array)$var2);
print_r($output);
配列([0] =>例[1] => test)
+=
あり、受け入れられた答えがあったことに気づきました+
。私のテストから、彼らは同じように振る舞うようです。