Assoziatives PHP-Präfix-Array mit Literalschlüsseln?

112

Ist es möglich, ein assoziatives Array mit Literalschlüssel => Wertepaaren voranzustellen? Ich weiß, dass array_unshift () mit numerischen Schlüsseln funktioniert, aber ich hoffe auf etwas, das mit Literalschlüsseln funktioniert.

Als Beispiel möchte ich Folgendes tun:

$array1 = array('fruit3'=>'apple', 'fruit4'=>'orange');
$array2 = array('fruit1'=>'cherry', 'fruit2'=>'blueberry');

// prepend magic

$resulting_array = ('fruit1'=>'cherry', 
                    'fruit2'=>'blueberry', 
                    'fruit3'=>'apple', 
                    'fruit4'=>'orange');
Colin Brock
quelle

Antworten:

217

Kannst du nicht einfach tun:

$resulting_array = $array2 + $array1;

?

Cletus
quelle
15
Siehe auch array_merge () und seinen Unterschied zur Verwendung des Operators +: br.php.net/manual/en/function.array-merge.php#92602
Havenard
2
@cletus: Meine Güte. Ja, ich kann. Ich bin mir nicht sicher, warum ich dachte, ich könnte nicht oder was funktionierte vorher nicht. Danke für die Antwort.
Colin Brock
Es ist erwähnenswert, dass dieser Unterschied für die Beibehaltung numerischer Schlüssel relevant ist, und dieses Array ist ein "reines" assoziatives Array mit Zeichenfolgenschlüsseln.
Cletus
29

Die Antwort ist nein. Sie können einem assoziativen Array kein Schlüssel-Wert-Paar voranstellen.

Sie können jedoch mit dem Vereinigungsoperator ein neues Array erstellen, das das neue Schlüssel-Wert-Paar am Anfang des Arrays enthält +. Das Ergebnis ist jedoch ein völlig neues Array, und das Erstellen des neuen Arrays ist O (n) komplex.

Die Syntax ist unten.

$new_array = array('new_key' => 'value') + $original_array;

Hinweis: Verwenden Sie nicht array_merge (). array_merge () überschreibt Schlüssel und behält keine numerischen Schlüssel bei.

PHPguru
quelle
"überschreibt Schlüssel und behält keine numerischen Schlüssel bei" ... a) Wie geht der Vereinigungsoperator ("+") mit "doppelten" Schlüsseln um? re: Zifferntasten nicht beibehalten: wahrscheinlich erwünscht
Brad Kent
16

In Ihrer Situation möchten Sie array_merge () verwenden:

array_merge(array('fruit1'=>'cherry', 'fruit2'=>'blueberry'), array('fruit3'=>'apple', 'fruit4'=>'orange'));

Verwenden Sie wieder array_merge (), um einem assoziativen Array anstelle von array_unshift () einen einzelnen Wert voranzustellen:

array_merge(array($key => $value), $myarray);
mvpetrovich
quelle
5

@Cletus ist genau richtig. Nur um hinzuzufügen, wenn die Reihenfolge der Elemente in den Eingabearrays nicht eindeutig ist und Sie das endgültige Array sortieren müssen, möchten Sie möglicherweise ksort :

$resulting_array = $array1 + $array2;
ksort($resulting_array);
karim79
quelle
4
Als späte Anmerkung wird ksortboolean zurückgegeben, daher muss das oben Gesagte als zwei Anweisungen ausgeführt werden, nicht als eine, z. B. $a = $array1 + $array2; ksort($a);ist $resulting_arraydies ein boolescher Wert, nicht das Array, das Sie erwartet haben.
El Yobo
3

Mit der gleichen Methode wie @mvpetrovich können Sie die Kurzversion eines Arrays verwenden, um die Syntax zu verkürzen.

$_array = array_merge(["key1" => "key_value"], $_old_array);

Verweise:

PHP: array_merge ()

PHP: Arrays - Handbuch

Ab PHP 5.4 können Sie auch die kurze Array-Syntax verwenden, die array () durch [] ersetzt.

Bryce Gough
quelle