Tablica asocjacyjna PHP poprzedzona kluczami literałów?

112

Czy można poprzedzić tablicę asocjacyjną parami literału klucz => wartość? Wiem, że array_unshift () działa z klawiszami numerycznymi, ale mam nadzieję na coś, co będzie działać z kluczami dosłownymi.

Jako przykład chciałbym wykonać następujące czynności:

$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
źródło

Odpowiedzi:

219

Nie możesz po prostu zrobić:

$resulting_array = $array2 + $array1;

?

cletus
źródło
15
Zobacz także array_merge () i jej różnicę w porównaniu z użyciem operatora +: br.php.net/manual/en/function.array-merge.php#92602
Havenard
2
@cletus: Sheesh. Tak, mogę. Nie jestem pewien, co sprawiło, że pomyślałem, że nie mogłem lub co wcześniej nie działało. Dzięki za odpowiedzi.
Colin Brock,
Warto zauważyć różnicę, ale ta różnica jest istotna dla zachowania kluczy numerycznych, a ta tablica jest „czystą” tablicą asocjacyjną z kluczami łańcuchowymi.
cletus
29

Odpowiedź brzmi nie. Nie można poprzedzić tablicy asocjacyjnej parą klucz-wartość.

Można jednak utworzyć nową tablicę zawierającą nową parę klucz-wartość na początku tablicy za pomocą operatora unii +. Rezultatem jest jednak zupełnie nowa tablica, a tworzenie nowej tablicy ma złożoność O (n).

Składnia jest poniżej.

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

Uwaga: nie używaj funkcji array_merge (). array_merge () nadpisuje klucze i nie zachowuje kluczy numerycznych.

PHPguru
źródło
„zastępuje klucze i nie zachowuje kluczy numerycznych”… a) w jaki sposób operator unii („+”) obsługuje „zduplikowane” klucze? re: nie zachowuj kluczy numerycznych: prawdopodobnie pożądane
Brad Kent
16

W swojej sytuacji chcesz użyć array_merge ():

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

Aby dodać pojedynczą wartość dla tablicy asocjacyjnej, zamiast array_unshift (), ponownie użyj array_merge ():

array_merge(array($key => $value), $myarray);
mvpetrovich
źródło
5

@Cletus jest na miejscu. Wystarczy dodać, że jeśli kolejność elementów w tablicach wejściowych jest niejednoznaczna i chcesz posortować ostateczną tablicę, możesz spróbować ksortować :

$resulting_array = $array1 + $array2;
ksort($resulting_array);
karim79
źródło
4
Jako późna uwaga ksortzwraca wartość logiczną, więc powyższe należy wykonać jako dwie instrukcje, a nie jedną, np. W $a = $array1 + $array2; ksort($a);przeciwnym razie $resulting_arraybędzie wartością logiczną, a nie tablicą, której się spodziewałeś.
El Yobo
3

Używając tej samej metody, co @mvpetrovich, możesz użyć skróconej wersji tablicy, aby skrócić składnię.

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

Bibliografia:

PHP: array_merge ()

PHP: Arrays - Manual

Od PHP 5.4 możesz także używać składni krótkich tablic, która zamienia array () na [].

Bryce Gough
źródło