@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.
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.
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:
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.
@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.
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.
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
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:
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
Die Array-Plus-Operation behandelt alle Arrays als Assoc-Array.
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;}
+=
und die akzeptierte Antwort hatten+
. Nach meinen Tests scheinen sie sich gleich zu verhalten.array_merge
? Es ist, als wären Arrays standardmäßig assoziative Arrays und numerische Arrays Bürger zweiter Klasse.Antworten:
Zitat aus dem PHP-Handbuch zu Sprachoperatoren
Also wenn du es tust
Sie erhalten
Die Logik von
+
entspricht also dem folgenden Snippet:Wenn Sie an den Details der Implementierung auf C-Ebene interessiert sind, gehen Sie zu
Beachten Sie, dass
+
sich dies vonarray_merge()
der Kombination der Arrays unterscheidet:würde dir geben
Weitere Beispiele finden Sie auf den verlinkten Seiten.
quelle
+
als auch denarray_merge
Aufrufzend_hash_merge
unter der Haube. Dies wird auch erwartet, da in PHP Arrays als geordnete Hash-Maps implementiert sind.+
undarray_merge
ist 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_merge
kann zum Verketten von listenartigen Arrays verwendet werden,+
kann es aber nicht. Im Gegensatz dazuarray_merge
wird+
immer die Operation ausgeführt, die in einer anderen Sprache als "Zusammenführen" bezeichnet wird.array_concat
für erstellt werden kannarray_merge
.Das beste Beispiel, das ich dafür gefunden habe, ist ein Konfigurationsarray.
Das ist
$default_vars
, wie vorgeschlagen, das Array für Standardwerte. Das$user_vars
Array überschreibt die in definierten Werte$default_vars
. Alle fehlenden Werte in$user_vars
sind jetzt die Standardwerte von$default_vars
.Dies würde
print_r
als:Ich hoffe das hilft!
quelle
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 .
quelle
Gehen Sie vorsichtig mit Zifferntasten um, wenn diese erhalten bleiben sollen oder wenn Sie nichts verlieren möchten
Union
verschmelzen
quelle
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:
Ausgänge:
quelle
+
durch die Spezifikationen garantiert? Was ist mitarray_replace
?Ich poste den Code unten, um die Dinge klar zu machen.
$a + $b = array_plus($a, $b)
quelle
Das neue Array wird an das vorherige angehängt.
quelle
Array ([0] => Beispiel [1] => Test)
quelle