2009-04-21 7 views
0

PHP.Quelle est la forme appropriée?

$a['0']=1; 
$a[0]=2; 

Quelle est la forme appropriée?

+1

La prochaine fois, essayez de choisir un meilleur titre. Quelque chose comme: "Quelle est la syntaxe correcte pour l'assignation de tableau en PHP?" – Hejazzman

+0

Vraiment? Vous pinailler le titre ??? wow – KOGI

Répondre

4

Dans le premier, vous auriez un élément de tableau: Key: 0 Indice 0

Dans le second exemple, vous avez seulement un ensemble d'indices. Index: 0

$arr = array(); 
$arr['Hello'] = 'World'; 
$arr['YoYo'] = 'Whazzap'; 
$arr[2]  = 'No key'; // Index 2 
+0

Dans votre exemple, il n'y a pas d'index 0 et 1, il est donc préférable d'éliminer ces commentaires. –

+0

Je pensais qu'il serait auto-indexé sur + 1? – sshow

+0

il n'y a pas d '"indexation automatique" sauf si vous utilisez la syntaxe $ arr [] =. – GoatRider

8

Dans le premier exemple que vous utilisez une chaîne pour indexer le tableau qui sera une table de hachage « sous le capot », qui est plus lent. Pour accéder à la valeur, un "nombre" est calculé à partir de la chaîne pour localiser la valeur que vous avez stockée. Ce calcul prend du temps.

Le deuxième exemple est un tableau basé sur des nombres qui est plus rapide. Les tableaux qui utilisent des nombres indexeront le tableau en fonction de ce nombre. 0 est l'indice 0; 1 est l'index 1. C'est un moyen très efficace d'accéder à un tableau. Aucun calcul complexe n'est nécessaire. L'index est juste un décalage par rapport au début du tableau pour accéder à la valeur.

Si vous utilisez uniquement des nombres, vous devez utiliser des nombres, pas des chaînes. Ce n'est pas une question de forme, c'est une question de savoir comment PHP va optimiser votre code. Les nombres sont plus rapides.

Cependant, les différences de vitesse sont négligeables lorsqu'ils traitent avec de petites tailles (tableaux stockant moins de 10 000 éléments, < Merci Paolo;)

+1

Je pense que vous surestimez les différences de vitesse ici. Oui, le premier est plus lent mais pas radicalement ou à un niveau quelconque qui le rend pertinent à une application à moins que vous ne fassiez des centaines de milliers de permutations. –

0

ils sont à la fois bien, ils seront tous deux travaux. La différence est que sur la première, vous définissez la valeur 1 à une clé appelée '0' sur le deuxième exemple, vous définissez la valeur 2 sur le premier élément dans le tableau.

ne pas les mélanger accidentellement;)

2

Si vous envisagez d'augmenter vos clés utilisent la deuxième option. Le premier est un tableau associatif qui contient la chaîne "0" comme clé.

4

Le truc "marrant", c'est que vous obtiendrez exactement le même résultat. PHP (pour une raison quelconque) teste si une chaîne utilisée comme index de tableau ne contient que des chiffres. Si c'est le cas, la chaîne est convertie en int ou en double.

<?php 
$x=array(); $x['0'] = 'foo'; 
var_dump($x); 

$x=array(); $x[0] = 'foo'; 
var_dump($x);

Pour les deux tableaux que vous obtenez [0] => toto, non [ "0"] => toto.

Ou un autre test:

<?php 
$x = array(); 
$x[0] = 'a'; 
$x['1'] = 'b'; 
$x['01'] = 'c'; 
$x['foo'] = 'd';

foreach($x as $k=>$v) { echo $k, ' ', gettype($k), "\n"; }

0 integer 
1 integer 
01 string 
foo string

Si vous ne croyez toujours pas jeter un oeil à #define HANDLE_NUMERIC (clé, longueur, func) dans zend_hash.h et quand et où il est utilisé.

Vous pensez que c'est bizarre? Choisissez un numéro et mettez-vous en ligne ...

+0

Oui, mais essayez $ x ['0'] = 'foo'; $ x [0] = 'bar'; – GoatRider

+0

Exactement mon point. $ x ['0'] = 'foo'; $ x [0] = 'bar'; var_dump ($ x); -> [0] => chaîne (3) "barre" – VolkerK

1

Ils sont tous les deux "corrects" mais ont les différents effets secondaires notés par d'autres.

Une autre chose que je voudrais signaler, si vous êtes juste pousser les éléments à un tableau, vous pouvez préférer cette syntaxe:

$ a = array(); $ a [] = 1; $ a [] = 2; // maintenant $ a [0] vaut 1 et $ a [1] vaut 2.

Questions connexes