Blog / Article #30
verifier si on est sur le dernier element d'un tableau php

star

13 Decembre 2013

Verifier si on est sur le dernier element d'un tableau php

php array check last

On est à la fin ou pas la ?

J'ai eu un petit bug lors d'un dev php pourtant banal, qui m'a posé un petit souci, le temps de comprendre ma boulette. Bon j'ai pas passé la nuit dessus non plus mais la chose est tellement simple qu'elle en devient vicieuse et on peut vite se laisser prendre au piège. Je simplifie la musique puisque le but n'est pas de savoir ce que je voulais faire de ce tableau... J'avais une itération à faire sur un array dynamique, et je devais effectuer une action spécifique sur la dernière clé. (rallonger le tableau ou pas bref un truc bizarre)

A la base...

Voila un exemple simple de ce que j'attendais de mon code...

foreach ($tableau as $cle => $valeur){
    if (si on est à la dernière clé){
        faireCeci();
    }        
}

Donc j'avais rapidement pondu un bout de code comme ça :

$tableau = array('a' => 1,'b' => 2,'c' => 3);
$derniereCle = end($tableau);
foreach($tableau as $cle => $valeur) {
    echo $valeur . '-';
    if($valeur === $derniereCle) {
         // ici on fait un truc spécial, merci au revoir
    }
}

Le problème c'est que si on rencontre la même valeur que la dernière plusieurs fois dans le tableau, tout saute, et ma condition se vérifie avant même que je n'arrive à la fin. Du coup, le script ne fonctionne pas, le client appelle et crie ou pire, il se déplace et me jète un cailloux. Ce genre de problème arrive d'autant plus souvent que le contenu du tableau se push dynamiquement, sans vraiment savoir au préalable ce qu'il contient, rendant vraiment cette faute d'anticipation très pénible quand tout plante, et surtout dans mon cas, aléatoirement.
(bah oui sinon c'est pas drôle)

La solution (une parmi tant d'autres)

$tableau = array('a' => 1, 'b' => 2,'c' => 3, 'd' => 2);
end($tableau);
$derniereCle = key($tableau);
foreach($tableau as $cle => $valeur) {
    if($cle === $derniereCle) {
        // pendant l'itération cette condition 
        // affirme qu'on est bien sur le dernier élément
    }
}

Voila en fait je vais chercher la dernière clé directement, puisque à l'inverse des valeurs, elles ne peuvent êtres identiques à plusieurs reprises dans le tableau. Ensuite j’attends tranquillement qu'on y vienne, en comparant à chaque fois avec la clé en cour et la, tout roule. Donc mon client est content, moi aussi et surtout je peux passer a autre chose... ^^

Selon une célèbre théorie de Grichka Bogdanoff (portant sur le dev web), ce sont toujours les erreurs les plus simples qui prennent le plus de temps à se laisser découvrir, je lui répondrais volontiers que chaque région de l'espace, aussi petite soit-elle, en descendant jusqu'au simple photon, contient la configuration de l'ensemble, mais il n'y comprendrait rien, n'est ce pas ?

Bonne journée !

PS : Un gentil lecteur me fait parvenir par mail sa manière à lui de régler le même problème, vu qu'il existe des tas de façons de faire la même chose, (comme je l'ai mentionné dans le sous titre). Son script est plus court car sa méthode pour récupérer la dernière clé ne tient que sur une ligne, j'aurais pu réduire aussi mais trop tard, ça compte plus, alors je partage ! ^^
Merci à lui et a bientôt !  ;)

$lastKey = array_pop(array_keys($array));
foreach ($array as $key => $value) {
    if ($key === $lastKey) {
        // Commander une pizza !
    }
}

Puisque ca ne mange pas de pain et que c'est toujours bien d'avoir un oeil sur la doc, voici les liens vers les fonctions PHP utilisées : end(), key(), array_keys(), array_pop()


Trop cool de me mettre un +1

Auteur de l'article
Retour a la liste