$test = array('hi');
$test += array('test','oh');
var_dump($test);
Was +
bedeutet für Array in PHP?
array_merge
? Es ist, als wären Arrays standardmäßig assoziative Arrays und numerische Arrays Bürger zweiter Klasse.
$test = array('hi');
$test += array('test','oh');
var_dump($test);
Was +
bedeutet für Array in PHP?
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
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.
+
als auch den array_merge
Aufruf zend_hash_merge
unter der Haube. Dies wird auch erwartet, da in PHP Arrays als geordnete Hash-Maps implementiert sind.
+
und array_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 dazu array_merge
wird +
immer die Operation ausgeführt, die in einer anderen Sprache als "Zusammenführen" bezeichnet wird.
array_concat
für erstellt werden kann array_merge
.
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_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:
Array(2){
"username" => "John Doe",
"email" => "no-reply@domain.com"
}
Ich hoffe das hilft!
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 .
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
)
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
)
+
durch die Spezifikationen garantiert? Was ist mit array_replace
?
- 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;
}
$var1 = "example";
$var2 = "test";
$output = array_merge((array)$var1,(array)$var2);
print_r($output);
Array ([0] => Beispiel [1] => Test)
+=
und die akzeptierte Antwort hatten+
. Nach meinen Tests scheinen sie sich gleich zu verhalten.