Pendant mes tests avec Rector j’ai vu qu’il proposait parfois de remplacer ceci :
foreach ($table as $key => $value) {
if ($key !== 'main') {
...
}
}
Où la variable $value
n’est pas utilisée.
Par :
foreach (array_keys($table) as $key) {
if ($key !== 'main') {
...
}
}
Je me demande ce qu’il vaut mieux faire question performances, surtout avec un tableau copieux…
D’ailleurs je suppose qu’il vaudrait mieux sortir l’appel à array_keys()
de la boucle, comme ça :
$keys = array_keys($table);
foreach ($keys as $key) {
if ($key !== 'main') {
...
}
}
Z’en dites quoi vous ?
1 De nicosomb -
Salut Franck !
Je viens de trouver cette astuce : https://stackoverflow.com/questions/8822080/is-quicker-to-use-array-keys-in-a-foreach-statemnt-or-set-a-value-variable-tha
2 De nicosomb -
En me relisant, j’ai dit de la merde. Tu ne veux plus des valeurs.
Désolé pour le bruit.
3 De Franck -
Oui seul le
$key =>
est facultatif ;-)4 De Gilsoub -
J’en dis que t’as une bestiole qui se balade sur ta page !
5 De Franck -
Ah bon ? Je ne vois rien moi d’ici !
6 De Gilsoub -
Ah ben c’est chez moi alors, vais chercher la tapette à bestiole… ou la bombe pour les bestiole qui font scratch scratch… j’hésite ;-)
7 De saymonz -
Instinctivement, on peut se dire que si avoir
array_keys()
dans la boucle fonctionne, c’est bien que PHP met le résultat en cache pour itérer dessus, sinon il itérerait en boucle sur le premier élément, non ?Mais je vois le raisonnement, j’ai effectivement toujours lu qu’il fallait éviter un une fonction dont le résultat ne doit pas changer dans la définition d’un
while()
pour grapiller des performances. Ces “astuces”, qui datent de l’époque où PHP4 dominait le game, sont-elles toujours d’actualité ?8 De Franck -
saymonz ça a l’air toujours d’actualité (cf la 1re réponse sur cette page) ; j’ai refait le test avec PHP 8.1 et pareil, il vaut mieux sortir le
array_keys()
de la boucle.9 De saymonz -
L’un des commentaires sur cette réponse met en évidence une erreur assez grossière dans le benchmark : le
$array_keys = array_keys($array);
n’est pas pris en compte dans le temps chronométré pour la solution 3.Si on le déplace dans le chrono, la solution 2 (faire le
foreach
sur l’array
d’origine avec les clés et les valeurs) est finalement plus rapide, et itérer sur la fonctionarray_keys($array)
directement reste bien le pire comme tu l’avais pressenti.En revanche, il y a des liens vers d’autres threads qui semblent très intéressants pour creuser la question, notamment celui-ci.
10 De Franck -
Ah intéressant saymonz, je vais aller lire tout ça…
11 De Marie-Aude -
Alors pour info, quand on utilise un aggrégateur de flux comme feedly, la bestiole devient énôrme.. https://gyazo.com/9cb1e728cd7e36f96a0f32487d3af9a5
Et quand tu regardes ça sur un écran où tu as un petit point noir qui n’est pas un pixel mort mais un bug à l’ancienne, écrasé “sous” l’écran, ça fait très très très bizarre :)
12 De Franck -
:-)