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');

Odpowiedzi:


219

Nie możesz po prostu zrobić:

$resulting_array = $array2 + $array1;

?


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.


„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);

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

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 [].

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.