Różnica między array_push () a $ array [] =


117

W podręczniku PHP ( array_push ) mówi ...

Jeśli używasz array_push () do dodania jednego elementu do tablicy, lepiej użyć $ array [] =, ponieważ w ten sposób nie ma narzutu wywoływania funkcji.

Na przykład :

$arr = array();
array_push($arr, "stackoverflow");
print_r($arr);

vs

$arr[] = "stackoverflow";
print_r($arr);

Nie rozumiem, dlaczego istnieje duża różnica.


8
Jeden to wywołanie funkcji, a drugi nie. Dokładnie to, co jest wymienione w pudełku.
KingCrunch

1
Jednym z nich jest wywołanie funkcji, jak wspomniano powyżej, co oznacza użycie pewnych zasobów do przełączania sterowania na / z wywołania funkcji (w ten sposób skutkuje przetwarzaniem narzutu). Natomiast później po prostu od razu przypisuje się nowy element do tablicy.
Ghazanfar Mir

2
to pytanie zaoszczędziło mi dużo czasu na wciskaniu tablic :)
RozzA

Odpowiedzi:


151

Kiedy wywołujesz funkcję w PHP (na przykład array_push()), wywołanie wiąże się z dodatkowymi kosztami, ponieważ PHP musi wyszukać odniesienie do funkcji, znaleźć jej pozycję w pamięci i wykonać dowolny kod, który zdefiniuje.

Używanie $arr[] = 'some value';nie wymaga wywołania funkcji i implementuje dodawanie bezpośrednio do struktury danych. Dlatego dodawanie dużej ilości danych jest znacznie szybsze i bardziej efektywne pod względem wykorzystania zasobów $arr[].


3
a co jeśli taki zapis "$ arr [] = 'jakaś wartość';" sprowadza się do wywołania funkcji?
Tebe

1
@gekannt Jak to się stało? Czy masz na myśli, że „jakaś wartość” w Twoim komentarzu jest zamknięciem? To zapisze odniesienie do zamknięcia w tablicy. Jeśli masz na myśli, że „jakaś wartość” jest funkcją, która jest wywoływana, dodałaby cokolwiek ta funkcja zwraca.
Kirkland,

@Kirkland Operatory to po prostu funkcje z alternatywną składnią w większości języków podobnych do języka C, nie jestem ekspertem od PHP, ale mogę sobie wyobrazić, że zaimplementowali operatory w ten sam sposób, ponieważ jest to dialekt C.
Kevin

1
@Kevin: zgadzam się z tobą i jestem prawie pewien, że za alternatywną składnią kryje się funkcja, a nie ta wspomniana powyżej, jak widzę następujący komentarz w dokumentacji php: "Jeśli używasz array_push (), aby dodać jeden element do tablicy lepiej jest użyć $ array [] =, ponieważ w ten sposób nie ma narzutu wywołania funkcji. " nie mam teraz czasu, aby zobaczyć, co się za tym kryje, ponieważ wyszukiwane hasło jest nieco mylące dla wyszukiwarek :)
jnhghy - Alexandru Jantea

Czy istnieją dowody, które $arr[] = valuesą szybsze? Próbując sobie wyobrazić, dlaczego kompilator miałby traktować kod inaczej.
c ..

44

Możesz dodać więcej niż 1 element w jednym ujęciu do tablicy za pomocą array_push,

na przykład array_push($array_name, $element1, $element2,...)

Gdzie $ element1, $ element2, ... to elementy do dodania do tablicy.

Ale jeśli chcesz dodać tylko jeden element naraz, to preferowana powinna być inna metoda (np. Użycie $ array_name []).


Czy łączenie tych dwóch elementów w trakcie całego projektu jest złą praktyką?
PBwebD

1
@ testing123 Absolutnie nie. Dobrą praktyką jest użycie najbardziej wydajnego dostępnego rozwiązania, chyba że poważnie ogranicza czytelność, kompatybilność itp. (Lub jeśli musisz przestrzegać pewnych wskazówek dotyczących stylu).
Chris Kraszewski,

15

Różnica jest w poniższym wierszu: „ponieważ w ten sposób nie ma narzutu wywołania funkcji”.

array_push()zgłosi ostrzeżenie, jeśli pierwszy argument nie jest tablicą. Różni się to od $var[]zachowania podczas tworzenia nowej tablicy.


4
Nie powiedziałem, że to powód. W pytaniu zadawano różnicę i to też jest różnica
Baig

7

Powinieneś zawsze używać, $array[]jeśli to możliwe, ponieważ zgodnie z informacją w polu nie ma narzutu na wywołanie funkcji. Jest więc nieco szybszy niż wywołanie funkcji.


4

array_push - umieść jeden lub więcej elementów na końcu tablicy

Zwróć uwagę na słowa „ jeden lub więcej elementów na końcu ”, aby to zrobić używając $arr[]musisz uzyskać maksymalny rozmiar tablicy


Re „aby to zrobić używając $ arr [], musiałbyś uzyskać maksymalny rozmiar tablicy” . Nie, mylisz się $arr[...index...] = $value;z tym, o czym tutaj dyskutujemy, czyli z tym $arr[] = $value;. Nie musisz znać rozmiaru ani tablicy, aby naciskać na koniec. Wiele elementów to po prostu wielokrotne wywołania: $arr[] = $value1; $arr[] = $value2; $arr[] = $value3;
ToolmakerSteve

2

wyjaśnij: 1. pierwszy z nich deklaruje zmienną w tablicy.

2. druga metoda array_push jest używana do wypychania łańcucha w zmiennej tablicowej.

3. na koniec wydrukuje wynik.

4. druga metoda polega na bezpośrednim zapisaniu ciągu w tablicy.

5. dane są drukowane w tablicy wartości przy użyciu metody print_r.

te dwa są takie same


1

oba są takie same, ale array_push tworzy pętlę w swoim parametrze, który jest tablicą i wykonuje $ array [] = $ element


0

Wiem, że to stara odpowiedź, ale innym może się przydać, aby wiedzieć, że kolejną różnicą między nimi jest to, że jeśli musisz dodać więcej niż 2/3 wartości na pętlę do tablicy, jej użycie jest szybsze:

     for($i = 0; $i < 10; $i++){
          array_push($arr, $i, $i*2, $i*3, $i*4, ...)
     }

zamiast:

     for($i = 0; $i < 10; $i++){
         $arr[] = $i;
         $arr[] = $i*2;
         $arr[] = $i*3;
         $arr[] = $i*4;
         ...
     }

edytuj - Zapomniałem zamknąć nawias forwarunkowy


1
Zastanawiam się, jak to wypada w porównaniu z array_merge. Np for(...){ $arr = $arr + [$i, $i*2, $i*3, $i*4, ...] }. Spekuluję, że array_push jest nadal nieco szybszy.
ToolmakerSteve

0

Nikt nie powiedział, ale array_push tylko wypycha element do KONIEC TABLICY, gdzie $ tablica [indeks] może wstawić wartość do dowolnego podanego indeksu. Duża różnica.


Pytanie brzmiało „Różnica między array_push () a $ array [] =” to, co powiedziałem, to jedna różnica. Duży!
Marco

1
Z całym szacunkiem się nie zgadzam. Opisujesz $array[index] = , co jest inną operacją niż $array[] = .... Pytanie podaje dwa fragmenty kodu i pyta, dlaczego byłaby między nimi znacząca różnica [wydajności] . Pytanie dosłownie oznacza $array[] = ..., który jest specyficznym idiomem php, który nie zawiera indeksu. tablica + indeks rozwiązuje inny problem, daje inny kod i to inny kompromis.
ToolmakerSteve
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.