+ PHPの配列の演算子?


192
$test = array('hi');
$test += array('test','oh');
var_dump($test);

+PHPの配列はどういう意味ですか?


5
私はあなたの質問が+=あり、受け入れられた答えがあったことに気づきました+。私のテストから、彼らは同じように振る舞うようです。
user151841 2012

7
ドキュメントはかなりよく、それを合計
artfulrobot


@RobbieAverill-これは、参照質問が参照する質問です。ですから、もし参照の質問が重複しているとしたら
icc97 '21

2
配列の連結などの基本的なことを実行しなければならないことを少し怖がっている人はいますarray_mergeか?これは、配列がデフォルトで連想配列であり、数値配列が第2クラスのシチズンであるかのようです。
icc97 2016年

回答:


271

言語演算子に関する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
)

その他の例については、リンク先のページを参照してください。


1
php.netによって生成された@Pacerier PHPには正式な仕様はありませんが、+との両方が内部でarray_merge呼び出さzend_hash_mergeれます。PHPでは配列が順序付けされたハッシュマップとして実装されているため、これも予想されます。
ビショップ

1
@Pacerier php.netのオンラインドキュメントは仕様に最も近いレコードですが、IMOのドキュメントは真の仕様にはほど遠いものです。1つ目は、コードが記述された後に更新されることです。2つ目は、特別な使用法をすべて網羅するように作成されていないことです。
ビショップ

14
PHPの振る舞いの+array_mergeあまのじゃくと直感的です。これらは、平易な英語の読みが配列を「追加」または「マージ」することで直感的にわかることとは逆の方法です。他の言語/ライブラリは+、リストを連結(例:Python)し、ある関数から別のオブジェクト(例:ロダッシュ)にキーと値のペアを追加する「マージ」関数を使用します。しかし、PHPではその逆です。array_mergeリストのような配列の連結に使用できますが、使用+できません。とは異なりarray_merge+他の言語では「マージ」と呼ばれる操作を常に実行します。
Mark Amery 2015

1
@ icc97それらは確かにHashMapだけです。nikic.github.io/2014/12/22/…を
Gordon

2
のエイリアスを作成できるかどうか確認するために、バグ送信してみarray_concatましたarray_merge
icc97 2016年

18

これを使用するために見つけた最良の例は、構成配列にあります。

$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"
}

これが役に立てば幸いです!


6

この演算子は、2つの配列の和集合を取ります(array_mergeと重複するキーが上書きされることを除いて、array_mergeと同じです)。

配列演算子のドキュメントはここにあります


1
初心者向けの注意点として、配列のいずれかがnullの場合、操作の結果はnullになります。ユニオン演算であるため、これを気にしない人もいるでしょう。結果の1つがnullの場合、結果は適切な(nullではない)配列になります。ただし、配列の1つが空の配列である場合も同様です。
Sandeepan Nath

したがって、良い方法として、入力配列を空の配列として初期化する必要があると思います。君たちは何と言いますか?
Sandeepan Nath 2012

5

テンキーを保持する必要がある場合、または何かを失いたくない場合は、テンキーに注意してください。

$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
)

3

+オペレータは、同じ結果を生成)(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ですか?
Pacerier 2015年

1
  1. 配列プラス操作は、すべての配列を連想配列として扱います。
  2. プラス中にキーが競合すると、左(前の)値が保持されます

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

$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;
}

@Tamlynのコード実行は、「配列と操作ですべての配列が連想配列として扱われる」という主張が間違っていることを証明しているようです。
Pacerier 2015年

@Pacerierキーは整数でもかまいません。
Hitesh


-4
$var1 = "example";
$var2 = "test";
$output = array_merge((array)$var1,(array)$var2);
print_r($output);

配列([0] =>例[1] => test)


1
このスレッドは、array_merge()が合同ではないことを数回言及しています。
doublejosh 2013年

@doublejosh、「合同」?意味?
Pacerier 2015年

1
彼らは同じではありません。
doublejosh 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.