Indexation des tableaux PHP :$array[$index] contre $array["$index"] contre $array["{$index}"]

StackOverflow https://stackoverflow.com/questions/6628

  •  08-06-2019
  •  | 
  •  

Question

Quelle est la différence, le cas échéant, entre ces méthodes d'indexation dans un tableau PHP :

$array[$index]
$array["$index"]
$array["{$index}"]

Je m'intéresse à la fois aux performances et aux différences fonctionnelles.

Mise à jour:

(En réponse à @Jeremy) Je ne suis pas sûr que ce soit vrai.J'ai exécuté ce code :

  $array = array(100, 200, 300);
  print_r($array);
  $idx = 0;
  $array[$idx] = 123;
  print_r($array);
  $array["$idx"] = 456;
  print_r($array);
  $array["{$idx}"] = 789;
  print_r($array);

Et j'ai obtenu ce résultat :

Array
(
    [0] => 100
    [1] => 200
    [2] => 300
)

Array
(
    [0] => 123
    [1] => 200
    [2] => 300
)

Array
(
    [0] => 456
    [1] => 200
    [2] => 300
)

Array
(
    [0] => 789
    [1] => 200
    [2] => 300
)
Était-ce utile?

La solution

voir @svec et @jeremy ci-dessus.Tous les indices de tableau sont d'abord de type «int», puis tapez «string», et seront convertis en celui-ci comme PHP le juge opportun.

En termes de performances, $index devrait être plus rapide que "$index" et "{$index}" (qui sont identiques).

Une fois que vous démarrez une chaîne entre guillemets, PHP passe en mode interpolation et la traite d'abord comme une chaîne, mais recherche des marqueurs de variable ($, {}, etc.) à remplacer dans la portée locale.C'est pourquoi dans la plupart des discussions, les vraies chaînes "statiques" doivent toujours être des guillemets simples, sauf si vous avez besoin de raccourcis d'échappement comme " " ou " ", car PHP n'aura pas besoin d'essayer d'interpoler la chaîne au moment de l'exécution et le la chaîne complète peut être compilée de manière statique.

Dans ce cas, les guillemets copieront d'abord le $index dans cette chaîne, puis renverront la chaîne, où l'utilisation directe de $index renverra simplement la chaîne.

Autres conseils

J'ai chronométré les 3 façons d'utiliser un index comme ceci :

for ($ii = 0; $ii < 1000000; $ii++) {
   // TEST 1
   $array[$idx] = $ii;
   // TEST 2
   $array["$idx"] = $ii;
   // TEST 3
   $array["{$idx}"] = $ii;
}

La première série de tests utilisés $idx=0, le deuxième ensemble utilisé $idx="0", et le troisième ensemble utilisé $idx="blah".Le chronométrage a été effectué à l'aide microtime() différences.J'utilise WinXP, PHP 5.2, Apache 2.2 et Vim.:-)

Et voici les résultats:

En utilisant $idx = 0

$array[$idx]            // time: 0.45435905456543 seconds
$array["$idx"]          // time: 1.0537171363831 seconds
$array["{$idx}"]        // time: 1.0621709823608 seconds
ratio "$idx" / $idx     // 2.3191287282497
ratio "{$idx}" / $idx   // 2.3377348193858

En utilisant $idx = "0"

$array[$idx]            // time: 0.5107250213623 seconds
$array["$idx"]          // time: 0.77445602416992 seconds
$array["{$idx}"]        // time: 0.77329802513123 seconds
ratio "$idx" / $idx     // = 1.5163855142717
ratio "{$idx}" / $idx   // = 1.5141181512285

En utilisant $idx = "blah"

$array[$idx]           // time: 0.48077392578125 seconds
$array["$idx"]         // time: 0.73676419258118 seconds
$array["{$idx}"]       // time: 0.71499705314636 seconds
ratio "$idx" / $idx    // = 1.5324545551923
ratio "{$idx}" / $idx  // = 1.4871793473086

Donc $array[$idx] est le vainqueur haut la main du concours de performances, du moins sur ma machine.(Les résultats étaient très reproductibles, BTW, je l'ai exécuté 3 ou 4 fois et j'ai obtenu les mêmes résultats.)

Je crois dans une perspective de performance que $ array ["$ index"] est plus rapide que $ array [$ index] voir les meilleures pratiques pour optimiser les performances du code PHP

Ne croyez pas aveuglément tout ce que vous lisez...Je pense que vous avez mal interprété cela.L'article indique que $array['index'] est plus rapide que $array[index] où index est un chaîne, pas une variable.En effet, si vous ne le mettez pas entre guillemets, PHP recherche une variable constante et n'en trouve pas, suppose donc que vous vouliez en faire une chaîne.

Quand les différentes méthodes d’indexation se résoudront-elles en différents indices ?

Selon http://php.net/types.array, un index de tableau ne peut être qu'un entier ou une chaîne.Si vous essayez d'utiliser un float comme index, il le tronquera en entier.Donc si $index est un float de valeur 3,14, alors $array[$index] évaluera à $array[3] et $array["$index"] évaluera à $array['3.14'].Voici un code qui le confirme :

$array = array(3.14 => 'float', '3.14' => 'string');
print_r($array);

$index = 3.14;
echo $array[$index]."\n";
echo $array["$index"]."\n";

Le résultat:

Array([3] => float [3.14] => string)
float
string

Réponse à la mise à jour :

Oh, vous avez raison, je suppose que PHP doit convertir les chaînes d'index de tableau en nombres si elles ne contiennent que des chiffres.J'ai essayé ce code :

$array = array('1' => 100, '2' => 200, 1 => 300, 2 => 400);
print_r($array);

Et le résultat était :

Array([1] => 300 [2] => 400)

J'ai fait quelques tests supplémentaires et j'ai découvert que si un index (ou une clé) de tableau est composé uniquement de chiffres, il est toujours converti en un entier, sinon c'est une chaîne.

éjunker :

Pouvez-vous expliquer pourquoi c'est plus rapide ?Ne nécessite-t-il pas une étape supplémentaire à l'interpréteur pour analyser "$index" dans la chaîne à utiliser comme index au lieu de simplement utiliser $index comme index ?

Si $index est une chaîne, il n'y a aucune différence car $index, "$index" et "{$index}" sont tous évalués comme la même chaîne.Si $index est un nombre, par exemple 10, la première ligne sera évaluée à $array[10] et les deux autres lignes seront évaluées à $array["10"] qui est un élément différent de $array[10].

Je pense que du point de vue des performances, $array["$index"] est plus rapide que $array[$index] Voir Meilleures pratiques pour optimiser les performances du code PHP

Une autre variante que j'utilise parfois lorsque j'ai un tableau à l'intérieur d'une chaîne est :

$str = "this is my string {$array["$index"]}";

Modifier:Ce que je voulais dire, c'est que $row['id'] est plus rapide que $row[id]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top