Bonjour a tous,

Je veux le code le plus court possible pour obtenir la référence (pour modification ou suppression, donc pas une copie) du dernier élément d'un tableau associatif.

Je tombe sur du code que je trouve lourd !

Voici les possibilités que j'ai trouvé :

1) Utilisation du (dangereux) COUNT-1

Tout dabord, cette solution m'impose l'utilisation d'un tableau indexé.. et la gestion des index qui va avec (voir ci-après).

Le classique count-1 est très dangereux en PHP tel quel car si on supprime un élément d'un tableau, php ne réindexe pas les élément :
Par exemple, si on retire l'élément 2 de 0,1,2,3
la liste des index du tableau va devenir 0,1,3.

Conséquence si l'on cherche a atteindre le dernier élément via (pourtant très classique), tab[count-1], php va tenter de retourner tab[2].. qui n'existe plus.

Bien sur on peut réindexer tout le tableau à chaque suppression via un array_values, mais c'est une opération supplémentaire que l'on m'impose sur ce tableau.. .. qui au départ était simplement associatif et que je dois maintenant indexer.. ..et réindexer à chaque suppression... Tout ca juste pour obtenir le dernier élément d'un tableau en écriture!

On tombe dans une lourdeur qui est le sujet de ce POST.

2) Le END()

end() déplace le pointeur interne du tableau array jusqu'au dernier élément et retourne sa valeur.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
<?php
 
$fruits = array('apple', 'banana', 'cranberry');
echo end($fruits); // cranberry
 
?>
sauf que je veux pouvoir modifier, ou supprimer 'cranberry'..

3) Le "array_pop"

Retourne la dernière valeur du tableau array ... mais le supprime du tableau.

Ca ne marche pas si je veux simplement modifier la valeur du dernier élément.

4) Les boucles

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
$derniere_cle=null;
foreach ($a as $k => $v) {
   echo "\$a[$k] => $v.\n";
   $derniere_cle=$k;
 
}
 
$a[$derniere_cle]="...";
Oui.. juste pour obtenir le dernier élément d'un tableau (en écriture).. c'est ultra-lourd.


Quelqu'un connait un code plus court ?