Najlepszy sposób na zainicjowanie (pustej) tablicy w PHP

297

W niektórych innych językach (na przykład AS3) zauważono, że inicjowanie nowej tablicy jest szybsze, jeśli jest wykonywane w ten sposób, var foo = []a nie var foo = new Array()ze względu na tworzenie obiektów i tworzenie instancji. Zastanawiam się, czy są jakieś odpowiedniki w PHP?

class Foo {
    private $arr = array(); // is there another / better way?
}
Tom Auger
źródło
11
To wszystko co robię.
Matthew
2
Dziękujemy wszystkim, którzy odpowiedzieli (i tak szybko!). Musiałem arbitralnie wybrać odpowiedź, więc Andy wydawał się być najbardziej dogłębny.
Tom Auger,
1
To pytanie bardzo pomaga
Hitesh
spróbować array_fill? php.net/manual/en/function.array-fill.php
zx1986
2
@ zx1986 to dość nieporęczny sposób tworzenia pustej tablicy. Z pewnością mniej niż OP $arr = array()lub$arr = []
Tom Auger

Odpowiedzi:

189

W implementacjach ECMAScript (na przykład ActionScript lub JavaScript) Array()jest funkcją konstruktora i []jest częścią gramatyki literału tablicowego. Oba są zoptymalizowane i wykonywane na zupełnie różne sposoby, przy czym dosłowna gramatyka nie jest zawłaszczona przez narzut wywołany funkcją.

Z drugiej strony PHP ma konstrukcje językowe, które mogą wyglądać jak funkcje, ale nie są traktowane jako takie. Nawet w PHP 5.4, które obsługuje []jako alternatywę, nie ma różnicy w narzutach, ponieważ w przypadku kompilatora / parsera są one całkowicie synonimiczne.

// Before 5.4, you could only write
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// As of PHP 5.4, the following is synonymous with the above
$array = [
    "foo" => "bar",
    "bar" => "foo",
];

Jeśli potrzebujesz obsługi starszych wersji PHP, użyj poprzedniej składni. Istnieje również argument za czytelnością, ale jako wieloletni programista JS wydaje mi się to dość naturalne. Popełniłem błąd, próbując zainicjować tablice przy użyciu, []kiedy uczyłem się PHP.

Ta zmiana języka została pierwotnie zaproponowana i odrzucona ze względu na większość głosów przeciw głównym programistom z następującego powodu:

Ta łatka nie zostanie zaakceptowana, ponieważ niewielka większość głównych programistów zagłosowała przeciw. Chociaż biorąc pod uwagę skumulowaną średnią między głównymi programistami a głosami użytkowników, wydaje się, że jest odwrotnie, nie byłoby odpowiedzialne przesłanie łatki, która nie jest obsługiwana ani utrzymywana na dłuższą metę.

Wydaje się jednak, że nastąpiła zmiana serca prowadząca do wersji 5.4, być może pod wpływem implementacji obsługi popularnych baz danych, takich jak MongoDB (które używają składni ECMAScript).

Andy E.
źródło
51
Być może wprowadzono zmianę 5.4, ponieważ ludzie, którzy potrafili przeliterować „które” przejęli proces głosowania :)
Rob Grant
40
Wolę, $array = [];ponieważ ułatwia to poruszanie się między JS a PHP.
Justin
Więc czy jest $array = []; lepsza opcja? lub powinienem spróbować innego. który z nich jest lepszy
Hitesh
2
@hitesh: to kwestia osobistych preferencji. Oba są dokładnie takie same funkcjonalnie, []jest tylko trochę łatwiejsze do pisania.
Andy E
7
Składnia [] wydaje się być powszechnie preferowana, ale należy zauważyć, że duża liczba hostów nadal używa wyłącznie wersji 5.3. Jeśli chcesz rozpowszechniać swój kod, składnia [] zakończy się śmiercią.
itp.
204
$myArray = []; 

Tworzy pustą tablicę.

Później możesz wypchnąć wartości na tablicę, w ten sposób:

$myArray[] = "tree";
$myArray[] = "house";
$myArray[] = "dog";

W tym momencie $ myArray zawiera „drzewo”, „dom” i „pies”. Każde z powyższych poleceń dołącza się do tablicy, zachowując elementy, które już tam były.

Pochodząc z innych języków, ten sposób dołączania do tablicy wydawał mi się dziwny. Spodziewałem się, że będę musiał zrobić coś takiego jak $ myArray + = „dog” lub coś w tym stylu… albo może metodę „add ()” taką jak w kolekcjach Visual Basic. Ale ta bezpośrednia składnia z pewnością jest krótka i wygodna.

W rzeczywistości musisz użyć funkcji unset (), aby usunąć elementy:

unset($myArray[1]); 

... usunąłby „house” z tablicy (tablice są zerowane).

unset($myArray); 

... zniszczyłby całą tablicę.

Żeby było jasne, składnia pustych nawiasów kwadratowych do dołączania do tablicy jest po prostu sposobem na powiedzenie PHP, aby automatycznie przypisywała indeksy do każdej wartości, a nie TY przypisujesz indeksy. Pod przykryciem PHP faktycznie robi to:

$myArray[0] = "tree";
$myArray[1] = "house";
$myArray[2] = "dog";

Możesz samodzielnie przypisywać indeksy, a także dowolne liczby. Możesz także przypisać numery indeksu do niektórych pozycji, a nie innych. Jeśli to zrobisz, PHP uzupełni brakujące numery indeksów, zwiększając od największego numeru indeksu przypisywanego w miarę upływu czasu.

Więc jeśli to zrobisz:

$myArray[10] = "tree";
$myArray[20] = "house";
$myArray[] = "dog";

... pozycja „pies” otrzyma numer indeksu 21. PHP nie wykonuje inteligentnego dopasowywania wzorca dla przyrostowego przypisywania indeksu, więc nie będzie wiedział, że być może chciałbyś przypisać indeks 30 do „pies „. Możesz użyć innych funkcji do określenia wzorca przyrostu dla tablicy. Nie będę wchodził w to tutaj, ale to wszystko w dokumentach PHP.

Twoje zdrowie,

- = Cameron

C Landreaux
źródło
6
Należy zauważyć, że $ ary = [] działa tylko po PHP 5.4. Z punktu widzenia wydajności nie ma jednak przewagi [] vs. array ().
Tom Auger
1
We wcześniejszych wersjach można użyć array_push () w3schools.com/php/func_array_push.asp Nie wiem, czy jest to związane z poprawą wydajności.
Mark
3
Źle zrozumiałeś @ TomAuger point @Mark. $array[] = 'foo'działa dobrze w starszych wersjach PHP. Wystarczy $array = [];zainicjować tablicę, która jest nowa w 5.4.
Codemonkey
Szczerze mówiąc, to faktycznie odpowiada na pytanie PO.
Smitty
lol ... umysł oszalał. Dziesięciolecia PHP i właśnie uczę się, że nie potrzebujesz tablicy_push.
Bangkokian
61

Przed PHP 5.4:

$myArray = array();

PHP 5.4 i wyżej

$myArray = [];
Md. Shafiqur Rahman
źródło
I jak możemy zrobić tablicę wielowymiarową za pomocą PHP 5.4 lub nowszego?
Siraj Alam
26

W PHP tablica jest tablicą; nie ma analizy prymitywnej vs. obiektowej, więc nie można uzyskać porównywalnej optymalizacji.

Adrian
źródło
1
Najlepsza odpowiedź IMO: istnieją różne składnie, ale pod względem wydajności wszystkie są takie same.
Matthieu Napoli
1
Czy w obu przypadkach występuje problem z wydajnością… gdzie mogę to sprawdzić… dowolny link lub dokument
Hitesh
2
W rezultacie, dopóki nie jesteś pewien kod nigdy nie będzie działać na pre 5,4 środowiskach, użyj $ array = new Array ()
Tom Auger
20

To, co robisz, jest w 100% prawidłowe.

Jeśli chodzi o ładne nazewnictwo, często zdarza się, że właściwości prywatne / chronione są poprzedzone znakiem podkreślenia, aby było oczywiste, że nie są publiczne. np private $_arr = array()lubpublic $arr = array()

James C.
źródło
2
W php myślę, że lepiej nie nazywać ich podkreślnikiem, ponieważ zawsze używasz, $thisaby uzyskać wartość i nigdy nie powinieneś używać właściwości publicznych.
meze
1
@eze, będziesz mieć do nich dostęp jak $this->arri $this->_arr. Dlaczego nigdy nie powinieneś korzystać z nieruchomości publicznych ?!
James C
5

Spróbuj tego:

    $arr = (array) null;
    var_dump($arr);

    // will print
    // array(0) { }
Pyetro
źródło
4
Trochę fajnie, ale bardziej jako imprezowa sztuczka niż naprawdę przydatny wzór kodowania, nie sądzisz?
Tom Auger
Może być przydatny, jeśli chcesz utworzyć tablicę w obiekcie ze wzorem właściwości i na końcu przekonwertować ją na tablicę.
Jomar Sevillejo,
4

Nie ma innej drogi , więc jest najlepsza.

Edycja: Ta odpowiedź jest nieprawidłowa od wersji PHP 5.4 i nowszych.

Matthieu Napoli
źródło
Tak już nie jest, w 5.4 wprowadzono skróconą składnię tablic.
Andy E
13
@Motes Dlaczego tak wiele nienawiści: „(żartuję, odłożyłem to bardziej wyraźnie,„ uderzając ”starą odpowiedź. Dla początkującego może być przydatne zrozumienie, że odpowiedź się zmieniła.
Matthieu Napoli
@Motes Ludzie tracą zysk na powtórzenie od odpowiedzi, gdy ją usuwają. Lepiej go edytować.
mbomb007,
4

Inicjowanie prostej tablicy:

<?php $array1=array(10,20,30,40,50); ?>

Inicjowanie tablicy w tablicy:

<?php  $array2=array(6,"santosh","rahul",array("x","y","z")); ?>

Źródło: Sorce dla kodu

programista
źródło
3
Pierwotne pytanie dotyczyło sposobu inicjowania pustej tablicy.
Tom Auger,