Czego lepiej używać w PHP, $ array [] = $ wartość lub array_push ($ tablica, $ wartość)?

113

Czego lepiej użyć w PHP do dołączania elementu tablicy,

$array[] = $value;

lub

array_push($array, $value);

?

Chociaż podręcznik mówi, że lepiej jest unikać wywołania funkcji, czytałem również, że $array[]jest znacznie wolniejszy niż array_push(). Jakie są wyjaśnienia lub punkty odniesienia?

Alex
źródło
2
$ myArray [] = 123; Będzie to szybsze niż funkcja array_push. Bezpośrednio dodaje wartość do tej tablicy. Funkcja ma oddzielny stos dla tych zmiennych. i może mieć to stwierdzenie wewnątrz tej funkcji.
sganesh

Odpowiedzi:

152

Żadnych testów porównawczych, ale osobiście uważam, że $array[]jest czystszy, a uczciwe dzielenie włosów w ciągu milisekund jest raczej nieistotne, chyba że planujesz dołączyć setki tysięcy ciągów do swojej tablicy.

Edycja : uruchomiono ten kod:

$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    $array[] = $i;
}
print microtime(true) - $t;
print '<br>';
$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    array_push($array, $i);
}
print microtime(true) - $t;

Pierwsza metoda $array[]jest prawie o 50% szybsza niż druga.

Niektóre wyniki testów porównawczych:

Run 1
0.0054171085357666 // array_push
0.0028800964355469 // array[]

Run 2
0.0054559707641602 // array_push
0.002892017364502 // array[]

Run 3
0.0055501461029053 // array_push
0.0028610229492188 // array[]

Nie powinno to być zaskakujące, ponieważ podręcznik PHP zauważa, że:

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.

Sposób, w jaki jest sformułowany, nie zdziwiłbym się, gdyby array_pushbył bardziej wydajny podczas dodawania wielu wartości. EDYCJA : Z ciekawości przeprowadziłem dalsze testy, a nawet przy dużej liczbie dodatków pojedyncze $array[]połączenia są szybsze niż jedno duże array_push. Ciekawy.

Paolo Bergantino
źródło
Po prostu zawsze wolę wiedzieć, który sposób jest najszybszy, więc kiedy nadejdzie dzień, zostanę poproszony o utworzenie witryny o dużym natężeniu ruchu, będę miał wgląd. Dziękuję za odpowiedź.
Alex
10
Takie mikrooptymalizacje rzadko są warte wysiłku. Jeśli piszesz od zera, zrób to, jak ma to największy sens, a dopiero potem, jeśli tworzenie strony jest trochę powolne, profiluj ją. Szanse na doprowadzenie do konieczności zmiany czegoś takiego, aby przyspieszyć, są niewielkie.
Alister Bulman
4
Aby się upewnić, ponieważ kod wydaje się nie pasować do danych wyjściowych, zweryfikowałem, że $array[]jest to rzeczywiście znacznie szybsze, 300 ms w porównaniu z 2000 ms dla 1 mln zadań na moim komputerze. Jednak dodanie 20 elementów naraz w array_push trwało mniej więcej 20 $array[] =sekund.
Elle
5
@AlisterBulman Mikro-optymalizacje nie są warte wysiłku, jeśli myślisz o cofnięciu się do całej bazy kodu i jej „optymalizacji”. Jeśli jednak masz kilka różnych sposobów robienia tego samego i jesteś świadomy, że jeden sposób jest lepszy (nawet trochę) niż inne, możesz przyzwyczaić się do tego. Dlaczego nie zrobiłbyś tego?
Okonomiyaki3000
2
@AlisterBulman Zdecydowanie się nie zgadzam, a przynajmniej częściowo, jeśli wiesz lepiej, pisz lepiej , ale nie wkładaj zbyt wiele wysiłku w poszukiwanie możliwej mikro-optymalizacji ...
jave.web
42

Głównym zastosowaniem array_push () jest to, że możesz umieścić wiele wartości na końcu tablicy.

W dokumentacji jest napisane :

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.

Inspirować
źródło
29

Z dokumentów php dlaarray_push :

Uwaga: 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łania funkcji.

Benedict Cohen
źródło
Zabawne, że twoja odpowiedź była pierwsza, ale jest mniej głosowana.
T.Woody
21

Mówi się, że [] jest szybsze, ponieważ nie ma narzutu związanego z wywołaniem funkcji. Poza tym nikt tak naprawdę nie lubi funkcji tablicowych PHP ...

„Czy to ... stóg siana, igła .... czy to stóg siana igły ... ah, pieprzyć to ... [] =”

typoneerror
źródło
7
Co? Funkcje tablicowe PHP są niesamowite.
cletus
13
Funkcjonalnie są niesamowite, tak, ale odnosił się do niespójnego schematu nazewnictwa.
ryeguy
2
Powinieneś włączyć podpowiedzi parametrów w swoim IDE. Ale zgadzam się, pewna konsekwencja byłaby świetna.
Pim Jager
4
Zgadzam się z tym. Nie ma spójności ani w schemacie nazewnictwa (x_y lub xy lub y_x ...), ani w logice parametrów (przekazuj obiekt docelowy najpierw, na końcu, między tablicami, łańcuchami i wyrażeniami regularnymi, powodzenia w znalezieniu wspólnej reguły!).
e2-e4
3
FWIW, podoba mi się konwencja nazewnictwa igły / stogu siana i uważam ją za łatwą do zapamiętania, ponieważ ma ona tę samą kolejność, co fraza: „jak znalezienie igły (1) w stogu siana (2)”
rybo111
8

Jedyną różnicą jest to, że możesz wywołać funkcję array_push () z więcej niż dwoma parametrami, tj. Możesz w jednej chwili wypychać do tablicy więcej niż jeden element.

$myArray = array();
array_push($myArray, 1,2,3,4);
echo join(',', $myArray);

wydruki 1,2,3,4

VolkerK
źródło
2

Prosta deklaracja $ myarray [] będzie szybsza, ponieważ po prostu wpychasz element na stos elementów z powodu braku narzutu, jaki przyniosłaby funkcja.

Tom Hallam
źródło
2

Ponieważ " array_push " jest funkcją i jest wywoływana wiele razy, gdy znajduje się wewnątrz pętli, więc przydzieli pamięć do stosu. Ale kiedy używamy $ tablica [] = $ wartość, to po prostu przypisujemy wartość do tablicy.

Vinod Kirte
źródło
1

Drugie to wywołanie funkcji, więc generalnie powinno być wolniejsze niż używanie podstawowych funkcji dostępu do tablicy. Ale myślę, że nawet jedno zapytanie do bazy danych w skrypcie przewyższy 1 000 000 wywołań array_push().

Stefan Gehrig
źródło
0

Chociaż pytanie dotyczyło bardziej wydajności, ludzie będą zadawać to pytanie, zastanawiając się, czy dobrą praktyką jest użycie array_pushlub $arr[].

Funkcja może oznaczać mniejsze wiersze dla wielu wartości:

// 1 line:
array_push($arr, "Bob", "Steve");
// versus 2 lines:
$arr[] = "Bob";
$arr[] = "Steve";

Jednakże , array_push...

  • nie może odebrać kluczy tablicy
  • łamie konwencję nazewnictwa igła / stóg siana
  • jest wolniejszy, jak omówiono

Będę się trzymał $arr[].

rybo111
źródło
0

Po prostu chcę dodać: int array_push(...)zwróć nową liczbę elementów w tablicy ( doc php ). który może być przydatny i bardziej kompaktowy niż $myArray[] = ...; $total = count($myArray);.

Ma również array_push(...)znaczenie, gdy zmienna jest używana jako stos.

Jean-Luc Barat
źródło