Le meilleur moyen d'initialiser un tableau (vide) en PHP

297

Dans certains autres langages (AS3 par exemple), il a été noté que l'initialisation d'un nouveau tableau est plus rapide s'il est fait ainsi var foo = []plutôt que var foo = new Array()pour des raisons de création et d'instanciation d'objets. Je me demande s'il y a des équivalences en PHP?

class Foo {
    private $arr = array(); // is there another / better way?
}
Tom Auger
la source
11
C'est tout ce que je fais.
Matthew
2
Merci à tous ceux qui ont répondu (et si vite!). J'ai dû choisir arbitrairement une réponse, alors Andy semblait être la plus approfondie.
Tom Auger
1
Cette question aide beaucoup
Hitesh
essayer array_fill? php.net/manual/en/function.array-fill.php
zx1986
2
@ zx1986 c'est une façon assez lourde de créer un tableau vide. Certainement moins que l'OP $arr = array()ou$arr = []
Tom Auger

Réponses:

189

Dans les implémentations ECMAScript (par exemple, ActionScript ou JavaScript), Array()est une fonction constructeur et []fait partie de la grammaire littérale du tableau. Les deux sont optimisés et exécutés de manières complètement différentes, la grammaire littérale n'étant pas gênée par la surcharge de l'appel d'une fonction.

PHP, d'autre part, a des constructions de langage qui peuvent ressembler à des fonctions mais qui ne sont pas traitées comme telles. Même avec PHP 5.4, qui prend []en charge une alternative, il n'y a pas de différence de surcharge car, en ce qui concerne le compilateur / analyseur, ils sont complètement synonymes.

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

Si vous devez prendre en charge les anciennes versions de PHP, utilisez l'ancienne syntaxe. Il y a aussi un argument pour la lisibilité mais, étant un développeur JS de longue date, ce dernier me semble plutôt naturel. En fait, j'ai fait l'erreur d'essayer d'initialiser des tableaux en utilisant []lorsque j'ai commencé à apprendre PHP.

Cette modification de la langue a été initialement proposée et rejetée en raison d'un vote majoritaire contre par les développeurs principaux pour la raison suivante:

Ce correctif ne sera pas accepté car une faible majorité des développeurs principaux ont voté contre. Bien que si vous prenez une moyenne accumulée entre les développeurs principaux et les votes de l'espace utilisateur semble montrer le contraire, il serait irresponsable de soumettre un patch qui n'est pas pris en charge ou maintenu à long terme.

Cependant, il semble qu'il y ait eu un changement d'avis menant à 5.4, peut-être influencé par les implémentations de la prise en charge des bases de données populaires comme MongoDB (qui utilisent la syntaxe ECMAScript).

Andy E
la source
51
Le changement de 5.4 a peut-être été fait parce que les personnes qui pouvaient épeler "qui" ont pris le relais du vote :)
Rob Grant
40
Je préfère $array = [];car cela facilite les allers-retours entre JS et PHP.
Justin
Alors, c'est une $array = []; meilleure option ??? ou devrais-je en essayer un autre. lequel est le meilleur
Hitesh
2
@hitesh: c'est une question de préférence personnelle. Ils sont tous deux exactement les mêmes fonctionnellement, []c'est juste un peu plus facile à taper.
Andy E
7
La syntaxe [] semble être universellement préférée, mais il est important de noter qu'il existe un grand nombre d'hôtes utilisant exclusivement 5.3. Si vous souhaitez distribuer votre code, la syntaxe [] sera fatale.
etc
204
$myArray = []; 

Crée un tableau vide.

Vous pouvez pousser des valeurs sur le tableau plus tard, comme ceci:

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

À ce stade, $ myArray contient "arbre", "maison" et "chien". Chacune des commandes ci-dessus s'ajoute au tableau, préservant les éléments qui s'y trouvaient déjà.

Venant d'autres langues, cette manière de s'ajouter à un tableau me semblait étrange. Je m'attendais à devoir faire quelque chose comme $ myArray + = "dog" ou quelque chose ... ou peut-être une méthode "add ()" comme les collections Visual Basic. Mais cette syntaxe d'ajout direct est certainement courte et pratique.

Vous devez en fait utiliser la fonction unset () pour supprimer des éléments:

unset($myArray[1]); 

... supprimerait "house" du tableau (les tableaux sont à base zéro).

unset($myArray); 

... détruirait tout le tableau.

Pour être clair, la syntaxe des crochets vides pour l'ajout à un tableau est simplement un moyen de dire à PHP d'affecter automatiquement les index à chaque valeur, plutôt que VOUS d'affecter les index. Sous les couvertures, PHP fait en fait ceci:

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

Vous pouvez vous-même attribuer des index si vous le souhaitez, et vous pouvez utiliser les nombres que vous souhaitez. Vous pouvez également attribuer des numéros d'index à certains éléments et pas à d'autres. Si vous faites cela, PHP remplira les numéros d'index manquants, en incrémentant à partir du plus grand numéro d'index attribué au fur et à mesure.

Donc, si vous faites cela:

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

... l'élément "chien" se verra attribuer un numéro d'index de 21. PHP ne fait pas d'appariement de modèle intelligent pour l'affectation incrémentielle d'index, donc il ne saura pas que vous auriez pu vouloir qu'il attribue un index de 30 à "chien" ". Vous pouvez utiliser d'autres fonctions pour spécifier le modèle d'incrémentation d'un tableau. Je n'entrerai pas dans les détails ici, mais tout est dans la documentation PHP.

À votre santé,

- = Cameron

C Landreaux
la source
6
Il est important de noter que $ ary = [] fonctionne uniquement après PHP 5.4. Du point de vue des performances, cependant, [] n'est pas avantageux par rapport à array ().
Tom Auger
1
Pour les versions antérieures, vous pouvez utiliser array_push () w3schools.com/php/func_array_push.asp Je ne sais pas si un impact sur les performances y est associé.
Mark
3
Vous avez mal compris @ le point de TomAuger @Mark. $array[] = 'foo'fonctionne très bien dans les anciennes versions de PHP. C'est seulement $array = [];pour initialiser un tableau qui est nouveau en 5.4.
Codemonkey
Pour être juste, cela répond en fait à la question du PO.
Smitty
lol ... l'esprit soufflé. Des décennies de PHP et j'apprends juste que vous n'avez pas besoin de array_push.
Bangkokian
61

Avant PHP 5.4:

$myArray = array();

PHP 5.4 et supérieur

$myArray = [];
Md. Shafiqur Rahman
la source
Et comment pouvons-nous créer un tableau multidimensionnel en utilisant PHP 5.4 ou supérieur?
Siraj Alam
26

En PHP, un tableau est un tableau; il n'y a pas de considération primitive vs objet, donc il n'y a pas d'optimisation comparable à avoir.

Adrian
la source
1
La meilleure réponse IMO: il existe différentes syntaxes, mais en ce qui concerne les performances, elles sont toutes identiques.
Matthieu Napoli
1
Y a-t-il un problème de performances impliqué pour les deux .. où puis-je vérifier à ce sujet .. n'importe quel lien ou document
Hitesh
2
Par conséquent, jusqu'à ce que vous soyez sûr que votre code ne sera jamais exécuté sur des environnements antérieurs à la version 5.4, utilisez $ array = new array ()
Tom Auger
20

Ce que vous faites est 100% correct.

En termes de nom agréable, il est souvent fait que les propriétés privées / protégées soient précédées d'un trait de soulignement pour rendre évident qu'elles ne sont pas publiques. Par exemple private $_arr = array()oupublic $arr = array()

James C
la source
2
En php, je pense qu'il vaut mieux ne pas les nommer avec un trait de soulignement car vous utilisez toujours $thispour obtenir la valeur et ne devez jamais utiliser les propriétés publiques.
meze
1
@meze vous y accéderiez comme $this->arret $this->_arr. Pourquoi ne devriez-vous jamais utiliser des propriétés publiques?!
James C
5

Essaye ça:

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

    // will print
    // array(0) { }
Pyetro
la source
4
Un peu cool, mais plus comme un truc de fête qu'un modèle de codage vraiment utile, vous ne trouvez pas?
Tom Auger
Cela pourrait être utile si vous souhaitez créer votre tableau dans un objet avec un modèle de propriétés et le convertir en tableau à la fin.
Jomar Sevillejo
4

Il n'y a pas d'autre moyen , c'est donc le meilleur.

Edit: Cette réponse n'est pas valide depuis PHP 5.4 et supérieur.

Matthieu Napoli
la source
Ce n'est plus le cas, 5.4 a introduit une syntaxe abrégée pour les tableaux.
Andy E
13
@Motes Pourquoi tant de haine: '(? Blague à part, je l'ai rendue plus explicite en "frappant" l'ancienne réponse. Il pourrait encore être utile pour un débutant de comprendre que la réponse a changé.
Matthieu Napoli
@Motes Les gens perdent le gain de répétition de la réponse lorsqu'ils le suppriment. Il vaut mieux l'éditer.
mbomb007
4

Initialisation d'un tableau simple:

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

Initialisation du tableau dans le tableau:

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

Source: Sorce pour le code

improgrammeur
la source
3
La question d'origine était de savoir comment initialiser un tableau vide .
Tom Auger