+ Operator für Array in PHP?


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

Was +bedeutet für Array in PHP?


5
Ich stelle fest, dass Ihre Frage +=und die akzeptierte Antwort hatten +. Nach meinen Tests scheinen sie sich gleich zu verhalten.
user151841

7
Die Dokumentation fasst es ziemlich gut zusammen
artfulrobot


@RobbieAverill - Dies ist die Frage, auf die sich diese Referenzfrage bezieht. Also, wenn überhaupt, ist diese Referenzfrage das Duplikat
icc97

2
Ist noch jemand etwas entsetzt darüber, dass so etwas Grundlegendes wie die Array-Verkettung durchgemacht werden muss array_merge? Es ist, als wären Arrays standardmäßig assoziative Arrays und numerische Arrays Bürger zweiter Klasse.
icc97

Antworten:


271

Zitat aus dem PHP-Handbuch zu Sprachoperatoren

Der Operator + gibt das rechte Array zurück, das an das linke Array angehängt ist. Für Schlüssel, die in beiden Arrays vorhanden sind, werden die Elemente aus dem linken Array verwendet und die übereinstimmenden Elemente aus dem rechten Array werden ignoriert.

Also wenn du es tust

$array1 = ['one',   'two',          'foo' => 'bar'];
$array2 = ['three', 'four', 'five', 'foo' => 'baz']; 

print_r($array1 + $array2);

Sie erhalten

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

Die Logik von +entspricht also dem folgenden Snippet:

$union = $array1;

foreach ($array2 as $key => $value) {
    if (false === array_key_exists($key, $union)) {
        $union[$key] = $value;
    }
}

Wenn Sie an den Details der Implementierung auf C-Ebene interessiert sind, gehen Sie zu


Beachten Sie, dass +sich dies von array_merge()der Kombination der Arrays unterscheidet:

print_r(array_merge($array1, $array2));

würde dir geben

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
)

Weitere Beispiele finden Sie auf den verlinkten Seiten.


1
@Pacerier PHP von php.net hat keine formale Spezifikation, sondern sowohl das +als auch den array_mergeAufruf zend_hash_mergeunter der Haube. Dies wird auch erwartet, da in PHP Arrays als geordnete Hash-Maps implementiert sind.
Bischof

1
@Pacerier Die Online-Dokumente von php.net sind der Spezifikation am nächsten, aber IMO entsprechen diese Dokumente bei weitem nicht der tatsächlichen Spezifikation: Erstens werden sie aktualisiert, nachdem der Code geschrieben wurde. Zweitens sind sie nicht für jede spezielle Verwendung geschrieben.
Bischof

14
Das Verhalten von PHP +und array_mergeist pervers und nicht intuitiv. Sie sind genau umgekehrt zu dem, was eine einfache englische Lesung Ihnen intuitiv sagen würde, wenn Sie Arrays hinzufügen oder zusammenführen würden. Andere Sprachen / Bibliotheken +verketten Listen (z. B. in Python) und "Zusammenführen", um die Schlüssel / Wert-Paare von einem Objekt zu einem anderen hinzuzufügen (z. B. in lodash). In PHP ist es jedoch umgekehrt. array_mergekann zum Verketten von listenartigen Arrays verwendet werden, +kann es aber nicht. Im Gegensatz dazu array_mergewird +immer die Operation ausgeführt, die in einer anderen Sprache als "Zusammenführen" bezeichnet wird.
Mark Amery

1
@ icc97 sie sind in der Tat nur HashMaps. Siehe nikic.github.io/2014/12/22/…
Gordon

2
Ich habe versucht , einen Fehler einzureichen, um festzustellen , ob ein Alias array_concatfür erstellt werden kann array_merge.
icc97

18

Das beste Beispiel, das ich dafür gefunden habe, ist ein Konfigurationsarray.

$user_vars = array("username"=>"John Doe");
$default_vars = array("username"=>"Unknown", "email"=>"no-reply@domain.com");

$config = $user_vars + $default_vars;

Das ist $default_vars, wie vorgeschlagen, das Array für Standardwerte. Das $user_varsArray überschreibt die in definierten Werte $default_vars. Alle fehlenden Werte in $user_varssind jetzt die Standardwerte von $default_vars.

Dies würde print_rals:

Array(2){
    "username" => "John Doe",
    "email" => "no-reply@domain.com"
}

Ich hoffe das hilft!


6

Dieser Operator verwendet zwei Arrays (wie array_merge, außer dass mit array_merge doppelte Schlüssel überschrieben werden).

Die Dokumentation für Array-Operatoren finden Sie hier .


1
Ein Wort der Vorsicht für Anfänger hier, das Ergebnis der Operation ist null, wenn eines der Arrays null ist . Einige interessieren sich möglicherweise nicht für diese Annahme, da es sich um eine Vereinigungsoperation handelt. Das Ergebnis ist das richtige (nicht null) Array, wenn eines von ihnen null ist. Dies gilt jedoch, wenn eines der Arrays ein leeres Array ist.
Sandeepan Nath

Daher sollten wir als bewährte Methode die Eingabearrays als leere Arrays initialisieren. Was sagt ihr?
Sandeepan Nath

5

Gehen Sie vorsichtig mit Zifferntasten um, wenn diese erhalten bleiben sollen oder wenn Sie nichts verlieren möchten

$a = array(2 => "a2", 4 => "a4", 5 => "a5");
$b = array(1 => "b1", 3 => "b3", 4 => "b4");

Union

print_r($a+$b);
Array
(
    [2] => a2
    [4] => a4
    [5] => a5
    [1] => b1
    [3] => b3
)

verschmelzen

print_r(array_merge($a, $b));
Array
(
    [0] => a2
    [1] => a4
    [2] => a5
    [3] => b1
    [4] => b3
    [5] => b4
)

3

Der +Operator erzeugt die gleichen Ergebnisse wie array_replace () . Da die Operatorargumente jedoch umgekehrt sind, kann auch die Reihenfolge des resultierenden Arrays unterschiedlich sein.

Erweitern eines weiteren Beispiels auf dieser Seite:

$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

Ausgänge:

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
)

Ist die Reihenfolge +durch die Spezifikationen garantiert? Was ist mit array_replace?
Pacerier

1
  1. Die Array-Plus-Operation behandelt alle Arrays als Assoc-Array.
  2. Bei einem Schlüsselkonflikt während des Plus wird der linke (vorherige) Wert beibehalten

Ich poste den Code unten, um die Dinge klar zu machen.

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

@ Tamlyns Codelauf scheint zu beweisen, dass Ihre Behauptung "Array plus Operation behandelt alle Arrays als Assoc-Array" falsch ist.
Pacerier

@ Pacerier dieser Schlüssel könnte auch eine ganze Zahl sein.
Hitesh


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

Array ([0] => Beispiel [1] => Test)


1
In diesem Thread wird einige Male erwähnt, dass array_merge () NICHT kongruent ist.
DoubleJosh

@doublejosh, "kongruent"? Bedeutung?
Pacerier

1
Sie sind nicht gleich.
DoubleJosh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.