Il modo migliore per inizializzare l'array (vuoto) in PHP


297

In alcuni altri linguaggi (ad esempio AS3), è stato notato che l'inizializzazione di un nuovo array è più veloce se eseguita in questo modo var foo = []piuttosto che var foo = new Array()per motivi di creazione e istanza di oggetti. Mi chiedo se ci siano equivalenze in PHP?

class Foo {
    private $arr = array(); // is there another / better way?
}

11
Questo è tutto ciò che faccio mai.
Matteo,

2
Grazie a tutti coloro che hanno risposto (e così in fretta!). Ho dovuto selezionare arbitrariamente una risposta in modo che Andy fosse la più approfondita.
Tom Auger,

1
Questa domanda aiuta molto
Hitesh,


2
@ zx1986 è un modo piuttosto ingombrante di creare un array vuoto. Certamente meno dell'OP $arr = array()o$arr = []
Tom Auger il

Risposte:


189

Nelle implementazioni ECMAScript (ad esempio ActionScript o JavaScript), Array()è una funzione di costruzione e []fa parte della grammatica letterale dell'array. Entrambi sono ottimizzati ed eseguiti in modi completamente diversi, con la grammatica letterale non perseguitata dal sovraccarico di chiamare una funzione.

PHP, d'altra parte, ha costrutti di linguaggio che possono apparire come funzioni ma non sono trattati come tali. Anche con PHP 5.4, che supporta []in alternativa, non vi è alcuna differenza nell'overhead perché, per quanto riguarda il compilatore / parser, sono completamente sinonimi.

// 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",
];

Se devi supportare versioni precedenti di PHP, usa la sintassi precedente. C'è anche un argomento per la leggibilità ma, essendo uno sviluppatore JS di lunga data, quest'ultimo mi sembra piuttosto naturale. In realtà ho fatto l'errore di provare a inizializzare le matrici usando []quando stavo imparando PHP per la prima volta.

Questa modifica alla lingua è stata originariamente proposta e respinta a causa di un voto di maggioranza contro gli sviluppatori principali con il seguente motivo:

Questa patch non sarà accettata perché la leggera maggioranza degli sviluppatori core ha votato contro. Anche se se prendi una media accumulata tra sviluppatori core e voti degli utenti sembrano mostrare il contrario, sarebbe irresponsabile presentare una patch che la strega non è supportata o mantenuta a lungo termine.

Tuttavia, sembra che ci sia stato un cambiamento di cuore che porta alla 5.4, forse influenzato dalle implementazioni del supporto per database popolari come MongoDB (che usano la sintassi ECMAScript).


51
Forse la modifica 5.4 è stata apportata perché le persone in grado di scrivere "quale" ha assunto il processo di voto :)
Rob Grant

40
Preferisco $array = [];perché rende più semplice andare avanti e indietro tra JS e PHP.
Giustino,

Quindi è l' $array = []; opzione migliore ??? o dovrei provare l'altro. quale è meglio
Hitesh

2
@hitesh: è una questione di preferenze personali. Sono entrambi esattamente uguali dal punto di vista funzionale, []è solo un po 'più facile da digitare.
Andy E

7
La sintassi [] sembra essere universalmente preferita, ma è importante notare che esiste un gran numero di host che usano ancora esclusivamente 5.3. Se si desidera distribuire il codice, la sintassi [] si interromperà.
ecc.,

204
$myArray = []; 

Crea un array vuoto.

È possibile inviare valori sull'array in un secondo momento, in questo modo:

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

A questo punto, $ myArray contiene "albero", "casa" e "cane". Ciascuno dei comandi precedenti aggiunge all'array, preservando gli elementi che erano già lì.

Essendo venuto da altre lingue, questo modo di aggiungere un array mi è sembrato strano. Mi aspettavo di dover fare qualcosa come $ myArray + = "dog" o qualcosa del genere ... o forse un metodo "add ()" come le raccolte di Visual Basic. Ma questa sintassi di aggiunta diretta è certamente breve e conveniente.

In realtà devi usare la funzione unset () per rimuovere elementi:

unset($myArray[1]); 

... eliminerebbe "house" dall'array (le matrici sono basate su zero).

unset($myArray); 

... distruggerebbe l'intero array.

Per essere chiari, la sintassi delle parentesi quadre vuote per l'aggiunta a un array è semplicemente un modo per dire a PHP di assegnare automaticamente gli indici a ciascun valore, invece di assegnare gli indici. Sotto le coperte, PHP sta effettivamente facendo questo:

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

Puoi assegnare gli indici tu stesso se vuoi, e puoi usare tutti i numeri che desideri. È inoltre possibile assegnare numeri di indice ad alcuni elementi e non ad altri. Se lo fai, PHP inserirà i numeri di indice mancanti, incrementando dal numero di indice più grande assegnato mentre procede.

Quindi se lo fai:

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

... alla voce "cane" verrà assegnato un numero indice di 21. PHP non esegue la corrispondenza intelligente dei modelli per l'assegnazione incrementale dell'indice, quindi non saprà che potresti aver voluto assegnare un indice di 30 a "cane ". È possibile utilizzare altre funzioni per specificare il modello di incremento per un array. Non entrerò in questo qui, ma è tutto nei documenti PHP.

Saluti,

- = Cameron


6
È importante notare che $ ary = [] funziona solo dopo PHP 5.4. Dal punto di vista delle prestazioni, tuttavia, non vi è alcun vantaggio su [] vs. array ().
Tom Auger,

1
Per le versioni precedenti è possibile utilizzare array_push () w3schools.com/php/func_array_push.asp Non so se sia associato un hit delle prestazioni.
Segna il

3
Hai frainteso il punto di TomAuger @ Mark. $array[] = 'foo'funziona perfettamente con le versioni precedenti di PHP. È solo $array = [];per inizializzare un array che è nuovo in 5.4.
Codemonkey,

Ad essere onesti, questo risponde effettivamente alla domanda del PO.
Smitty

lol ... La mente è saltata. Decenni di PHP e sto solo imparando che non hai bisogno di array_push.
Bangkok

61

Prima di PHP 5.4:

$myArray = array();

PHP 5.4 e versioni successive

$myArray = [];

E come possiamo creare array multidimensionali usando PHP 5.4 o versioni successive?
Siraj Alam,

26

In PHP un array è un array; non vi è alcuna considerazione primitiva rispetto all'oggetto, quindi non si può avere un'ottimizzazione comparabile.


1
La migliore risposta IMO: ci sono diverse sintassi, ma per quanto riguarda le prestazioni sono tutte uguali.
Matthieu Napoli,

1
C'è un problema di prestazioni coinvolto per entrambi ... dove posso controllare su questo .. qualsiasi link o documento
Hitesh

2
Di conseguenza, fino a quando non sei sicuro che il tuo codice non verrà mai eseguito su ambienti pre 5.4, usa $ array = new array ()
Tom Auger

20

Quello che stai facendo è corretto al 100%.

In termini di bella denominazione, spesso si fa in modo che le proprietà private / protette siano precedute da un carattere di sottolineatura per rendere evidente che non sono pubbliche. Ad esempio private $_arr = array()opublic $arr = array()


2
In php, penso che sia meglio non nominarli con un carattere di sottolineatura poiché usi sempre $thisper ottenere il valore e non dovresti mai usare proprietà pubbliche.
Meze,

1
@meze avresti accesso a loro come $this->arre $this->_arr. Perché non dovresti mai usare proprietà pubbliche ?!
James C,

5

Prova questo:

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

    // will print
    // array(0) { }

4
Fantastico, ma più come un trucco per le feste che un modello di programmazione davvero utile, non credi?
Tom Auger,

Potrebbe essere utile se vuoi creare il tuo array in un oggetto con pattern di proprietà e convertirlo in array alla fine.
Jomar Sevillejo,

4

Non c'è altro modo , quindi questo è il migliore.

Modifica: questa risposta non è valida a partire da PHP 5.4 e versioni successive.


Questo non è più il caso, 5.4 ha introdotto la sintassi abbreviata per gli array.
Andy E

13
@Motes Perché così tanto odio: '(? Scherzi a parte, l'ho resa più esplicita "colpendo" la vecchia risposta. Potrebbe essere utile per un principiante capire che la risposta è cambiata.
Matthieu Napoli,

@Motes Le persone perdono il guadagno in termini di rep dalla risposta quando lo eliminano. È meglio modificarlo.
mbomb007,

4

Inizializzazione di un array semplice:

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

Inizializzazione dell'array all'interno dell'array:

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

Fonte: Sorce per il codice


3
La domanda originale era su come inizializzare un array vuoto .
Tom Auger,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.