@RobbieAverill - to pytanie, do którego odnosi się to pytanie referencyjne. Więc jeśli cokolwiek to pytanie referencyjne jest duplikatem
icc97
2
Czy ktoś jeszcze jest nieco przerażony, że tak fundamentalna rzecz jak konkatenacja macierzy musi zostać wykonana array_merge? To tak, jakby tablice były domyślnie tablicami asocjacyjnymi, a tablice numeryczne są obywatelami drugiej kategorii.
Operator + zwraca tablicę po prawej stronie dołączoną do tablicy po lewej stronie; w przypadku kluczy istniejących w obu tablicach użyte zostaną elementy z tablicy po lewej stronie, a pasujące elementy z tablicy po prawej stronie zostaną zignorowane.
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))
Zatem logika +jest odpowiednikiem następującego fragmentu:
Zauważ, że +różni się to od sposobu array_merge()łączenia tablic:
print_r(array_merge($array1, $array2));
dałbym ci
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)
Zobacz połączone strony, aby uzyskać więcej przykładów.
@Pacerier PHP produkowany przez php.net nie ma formalnej specyfikacji, ale zarówno +i jak i array_mergecall zend_hash_mergepod maską. Jest to również oczekiwane, ponieważ w PHP tablice są implementowane jako uporządkowane mapy skrótów.
biskup
1
@Pacerier Dokumenty internetowe php.net są najbliższym zapisem specyfikacji, ale IMO te dokumenty nie są zgodne z prawdziwą specyfikacją: po pierwsze, są aktualizowane po napisaniu kodu; po drugie, nie są napisane, aby objąć każde specjalne użycie.
biskup
14
Zachowanie PHP +i array_mergejest przewrotny i nieintuicyjne. Są odwrotne od tego, co zwykłe angielskie czytanie intuicyjnie powiedziałoby ci, że wystarczy „dodać” lub „scalić” tablice. Inne języki / biblioteki używają +do łączenia list (np. W Pythonie) i funkcji „scalania”, aby dodać pary klucz / wartość z jednego obiektu do drugiego (np. W lodash). Jednak w PHP jest odwrotnie; array_mergemoże być używany do łączenia tablic podobnych do list, ale +nie może. W przeciwieństwie array_merge, +zawsze wykonuje operację, która będzie nazywana „scalania” w jakimkolwiek innym języku.
Jak $default_varssugeruje, jest to tablica wartości domyślnych. $user_varsTablica zastąpi wartości określone w $default_vars. Wszelkie brakujące wartości $user_varssą teraz zmiennymi domyślnymi$default_vars .
Słowo ostrzeżenia dla początkujących tutaj, wynik operacji jest zerowy, jeśli którakolwiek z tablic jest pusta . Niektórzy mogą nie przejmować się tym założeniem, ponieważ jest to operacja unii, wynikiem będzie odpowiednia tablica (nie-null), jeśli jedna z nich ma wartość null. Jest to prawdą, jeśli jedna z tablic jest pustą tablicą.
Sandeepan Nath,
Tak więc, myślę, że jako dobrą praktykę powinniśmy inicjować tablice wejściowe jako puste tablice. Co mówicie
Sandeepan Nath,
5
Ostrożnie z klawiszami numerycznymi, jeśli powinny zostać zachowane lub jeśli nie chcesz niczego stracić
+Operator daje takie same wyniki jak array_replace () . Ponieważ jednak argumenty operatora są odwrócone, kolejność wynikowej tablicy może być również inna.
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)
Czy +specyfikacja gwarantuje kolejność ? Co array_replace?
Pacerier
1
Operacja Array plus traktuje całą tablicę jako tablicę assoc.
W przypadku konfliktu kluczy podczas plusa zachowana zostanie lewa (poprzednia) wartość
Podaję poniższy kod, aby wszystko było jasne.
$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;}
+=
a odpowiedź zaakceptowana+
. Z moich testów wydają się one zachowywać tak samo.array_merge
? To tak, jakby tablice były domyślnie tablicami asocjacyjnymi, a tablice numeryczne są obywatelami drugiej kategorii.Odpowiedzi:
Cytowanie z podręcznika PHP dotyczącego operatorów języków
Jeśli tak
Dostaniesz
Zatem logika
+
jest odpowiednikiem następującego fragmentu:Jeśli jesteś zainteresowany szczegółami implementacji na poziomie C, przejdź do
Zauważ, że
+
różni się to od sposobuarray_merge()
łączenia tablic:dałbym ci
Zobacz połączone strony, aby uzyskać więcej przykładów.
źródło
+
i jak iarray_merge
callzend_hash_merge
pod maską. Jest to również oczekiwane, ponieważ w PHP tablice są implementowane jako uporządkowane mapy skrótów.+
iarray_merge
jest przewrotny i nieintuicyjne. Są odwrotne od tego, co zwykłe angielskie czytanie intuicyjnie powiedziałoby ci, że wystarczy „dodać” lub „scalić” tablice. Inne języki / biblioteki używają+
do łączenia list (np. W Pythonie) i funkcji „scalania”, aby dodać pary klucz / wartość z jednego obiektu do drugiego (np. W lodash). Jednak w PHP jest odwrotnie;array_merge
może być używany do łączenia tablic podobnych do list, ale+
nie może. W przeciwieństwiearray_merge
,+
zawsze wykonuje operację, która będzie nazywana „scalania” w jakimkolwiek innym języku.array_concat
można utworzyć aliasarray_merge
.Najlepszy przykład, jaki znalazłem, używając tego, to tablica konfiguracji.
Jak
$default_vars
sugeruje, jest to tablica wartości domyślnych.$user_vars
Tablica zastąpi wartości określone w$default_vars
. Wszelkie brakujące wartości$user_vars
są teraz zmiennymi domyślnymi$default_vars
.Byłoby to
print_r
:Mam nadzieję, że to pomoże!
źródło
Ten operator przyjmuje sumę dwóch tablic (tak samo jak array_merge, tyle że w przypadku array_merge duplikaty kluczy są nadpisywane).
Dokumentacja dla operatorów macierzy znajduje się tutaj .
źródło
Ostrożnie z klawiszami numerycznymi, jeśli powinny zostać zachowane lub jeśli nie chcesz niczego stracić
unia
łączyć
źródło
+
Operator daje takie same wyniki jak array_replace () . Ponieważ jednak argumenty operatora są odwrócone, kolejność wynikowej tablicy może być również inna.Rozwijanie innego przykładu z tej strony:
wyjścia:
źródło
+
specyfikacja gwarantuje kolejność ? Coarray_replace
?Podaję poniższy kod, aby wszystko było jasne.
$a + $b = array_plus($a, $b)
źródło
Dołącza nową tablicę do poprzedniej.
źródło
Tablica ([0] => przykład [1] => test)
źródło