Zusammenführen zweier Arrays mit dem „+“ (Array-Vereinigungsoperator) Wie funktioniert das?

Lesezeit: 6 Minuten

Benutzeravatar von user198729
Benutzer198729

Ich habe einen Code, der die Daten aus zwei Arrays zusammenzuführen scheint +=, enthält aber nicht alle Elemente im Element. Wie funktioniert es?

Beispiel:

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

Ausgang:

array(2) {
  [0]=>
  string(2) "hi"
  [1]=>
  string(2) "oh"
}

Was macht + bedeuten, wenn es auf Arrays in PHP verwendet wird?

  • Ich merke, Ihre Frage hatte += und die akzeptierte Antwort hatte +. Nach meinen Tests scheinen sie sich gleich zu verhalten.

    – Benutzer151841

    24. August 2012 um 17:24 Uhr

  • Der Dokumentation fasst es ziemlich gut zusammen

    – Kunstvoller Roboter

    22. August 2013 um 13:53 Uhr

  • mögliches Duplikat von Reference – Was bedeutet dieses Symbol in PHP?

    – Stalker

    26. Juni 2014 um 3:40 Uhr

  • @RobbieAverill – das ist die Frage, auf die sich diese Referenzfrage bezieht. Also, wenn überhaupt, ist diese Referenzfrage das Duplikat

    – icc97

    21. November 2016 um 12:29 Uhr

  • Ist noch jemand etwas entsetzt darüber, dass eine so grundlegende Sache wie die Array-Verkettung durchgeführt werden muss? array_merge? Es ist, als ob Arrays standardmäßig assoziative Arrays und numerische Arrays Bürger zweiter Klasse wären.

    – icc97

    21. November 2016 um 12:35 Uhr

Gordons Benutzeravatar
Gordon

Zitat aus der 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)
)

Also die Logik von + entspricht 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 C-Level-Implementierung interessiert sind, gehen Sie zu


Beachten Sie, dass + ist anders als wie array_merge() würde die Arrays kombinieren:

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.

  • @Pacerier PHP, das von php.net produziert wird, hat keine formale Spezifikation, aber sowohl die + Und array_merge Forderung zend_hash_merge unter der Haube. Dies ist auch zu erwarten, da in PHP Arrays als geordnete Hash-Maps implementiert sind.

    – Bischof

    19. Mai 2015 um 18:34 Uhr

  • @Pacerier Die php.net-Online-Dokumentation kommt einer Spezifikation am nächsten, aber meiner Meinung nach bleiben diese Dokumente weit hinter einer echten Spezifikation zurück: Erstens werden sie aktualisiert, nachdem der Code geschrieben wurde; Zweitens sind sie nicht so geschrieben, dass sie jede spezielle Verwendung abdecken.

    – Bischof

    25. Mai 2015 um 0:44 Uhr

  • Das Verhalten von PHP’s + Und array_merge ist pervers und unintuitiv. Sie sind genau umgekehrt zu dem, was eine einfache englische Lesart Ihnen intuitiv sagen würde, wenn Sie Arrays „hinzufügen“ oder „zusammenführen“ würden. Verwendung anderer Sprachen/Bibliotheken + um Listen zu verketten (zB in Python) und Funktionen zu “verschmelzen”, um die Schlüssel/Wert-Paare von einem Objekt zu einem anderen hinzuzufügen (zB in Lodash). Doch in PHP ist es umgekehrt; array_merge kann aber zum Verketten von listenartigen Arrays verwendet werden + kann nicht. nicht wie array_merge, + führt immer die Operation aus, die in jeder anderen Sprache als “Zusammenführen” bezeichnet würde.

    – Mark Amery

    11. August 2015 um 11:18 Uhr


  • @icc97 sie sind tatsächlich nur HashMaps. Sehen nikic.github.io/2014/12/22/…

    – Gordon

    21. November 2016 um 13:33 Uhr

  • ich habe es versucht einen Fehler melden um zu sehen, ob ein Alias array_concat geschaffen werden könnte array_merge.

    – icc97

    21. November 2016 um 22:04 Uhr

Benutzeravatar von Frank de Jonge
Frank de Jonge

Das beste Beispiel, das ich für die Verwendung gefunden habe, ist ein Konfigurationsarray.

$user_vars = array("username"=>"John Doe");
$default_vars = array("username"=>"Unknown", "email"=>"[email protected]");

$config = $user_vars + $default_vars;

Der $default_vars, wie es nahelegt, ist das Array für Standardwerte. Der $user_vars array überschreibt die in definierten Werte $default_vars. Alle fehlenden Werte in $user_vars sind nun die default vars aus $default_vars.

Das würde print_r als:

Array(2){
    "username" => "John Doe",
    "email" => "[email protected]"
}

Ich hoffe das hilft!

Benutzeravatar von Peter Smit
Peter Schmitt

Dieser Operator nimmt die Vereinigung zweier Arrays (dasselbe wie array_merge, außer dass mit array_merge doppelte Schlüssel überschrieben werden).

Die Dokumentation für Array-Operatoren wird gefunden Hier.

  • Ein Wort der Vorsicht für Anfänger hier, das Ergebnis der Operation ist Null wenn eines der Arrays ist Null. Einige interessieren sich möglicherweise nicht dafür, vorausgesetzt, da es sich um eine Union-Operation handelt, ist das Ergebnis das richtige (Nicht-Null-) Array, wenn eines von ihnen null ist. Aber das gilt, wenn eines der Arrays ein ist leer Reihe.

    – Sandeepan Nath

    13. Juli 2012 um 6:52 Uhr


  • Ich denke also, dass wir als gute Praxis die Eingabearrays als leere Arrays initialisieren sollten. Was sagt ihr?

    – Sandeepan Nath

    13. Juli 2012 um 6:58 Uhr

Seien Sie vorsichtig mit Zifferntasten, wenn diese erhalten bleiben sollen oder Sie nichts verlieren wollen

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

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

Erweitern Sie ein weiteres Beispiel von 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 von + Garantiert durch die Spezifikationen? Wie wäre es mit array_replace?

    – Schrittmacher

    30. März 2015 um 12:46 Uhr

  1. Die Array-Plus-Operation behandelt alle Arrays als assoziierte Arrays.
  2. Bei einem Tastenkonflikt während Plus wird der linke (vorherige) Wert beibehalten

Ich poste den Code unten, um die Dinge klarer 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;
}

  • Ist die Reihenfolge von + Garantiert durch die Spezifikationen? Wie wäre es mit array_replace?

    – Schrittmacher

    30. März 2015 um 12:46 Uhr

Benutzeravatar von n0099
n0099

Aus https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/
sqA1L

Davon abgesehen könnten wir uns den Operator + als etwas redundant vorstellen, da dasselbe mit der Funktion array_replace erreicht werden kann.

Es gibt jedoch Fälle, in denen es praktisch ist: Angenommen, Sie haben ein $options-Array, das an eine Funktion/Methode übergeben wird, und es gibt auch Standardwerte, die als Fallback verwendet werden können:

// we could do it like this
function foo(array $options)
{
   $defaults = ['foo' => 'bar'];
   
   $options = array_replace($defaults, $options);
 
   // ...
}
 
// but + here might be way better:
function foo(array $options)
{
   $options += ['foo' => 'bar'];
 
   // ...
}

1445160cookie-checkZusammenführen zweier Arrays mit dem „+“ (Array-Vereinigungsoperator) Wie funktioniert das?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy