web-dev-qa-db-fra.com

PHP récupère l'index du dernier élément inséré dans le tableau

C'est aussi simple que le titre le sonne; J'ai besoin d'obtenir l'index/la clé du dernier élément inséré. Pourquoi est-ce difficile? Voir les deux exemples de code suivants:

$a=array();
echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>';
echo 'res='.($a[]='bbb').' - '.(count($a)-1).'<br>';
echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>';
die('<pre>'.print_r($a,true).'</pre>');

Écrit:

res=aaa - 0
res=bbb - 1
res=aaa - 2
Array (
    [0] => aaa
    [1] => bbb
    [2] => aaa
)

Bien sûr, cela semble bien fonctionner, mais voyez ceci:

$a=array();
echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>';
echo 'res='.($a[2]='bbb').' - '.(count($a)-1).'<br>';
echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>';
die('<pre>'.print_r($a,true).'</pre>');

Écrit:

res=aaa - 0
res=bbb - 1       <- wrong!
res=aaa - 2       <- wrong!
Array (
    [0] => aaa
    [2] => bbb    <- real key
    [3] => aaa    <- real key
)

Donc, en bref, la solution de contournement populaire count($array)-1 est imparfaite.

50
Christian

Voici une solution linéaire ( la plus rapide ):

end($a);
$last_id=key($a);
67
romaninsh

Vous pouvez utiliser clé ($ a) avec fin ($ a)

$a=array();
$a[]='aaa'; foo($a);
$a[3]='bbb'; foo($a);
$a['foo']='ccc'; foo($a);
$a[]='ddd'; foo($a);

function foo(array $a) {
  end($a);
  echo 'count: ', count($a), ' last key: ', key($a), "\n";
}

impressions

count: 1 last key: 0
count: 2 last key: 3
count: 3 last key: foo
count: 4 last key: 4
20
VolkerK

Vous pouvez utiliser la fonction end () pour obtenir le dernier élément d'un tableau et array_keys () pour renvoyer un tableau des clés du tableau. Déroutant. En pratique, cela fonctionne comme ceci:

$key = end(array_keys($array));

Le mérite revient à Hollsk dans les commentaires.

18
Sam152

Si vous ne travaillez qu'avec des index numériques pour votre tableau, le dernier index généré automatiquement sera toujours la plus grande clé de tableau du tableau.

Ainsi, pour les index générés automatiquement, l'utilisation de quelque chose comme max(array_keys($a)) devrait fonctionner.

Par exemple, ceci:

$a=array();
echo 'res='.($a[]='aaa').' - '.(max(array_keys($a))).'<br>';
echo 'res='.($a[2]='bbb').' - '.(max(array_keys($a))).'<br>';
echo 'res='.($a[]='aaa').' - '.(max(array_keys($a))).'<br>';
die('<pre>'.print_r($a,true).'</pre>');

Vous obtiendrait:

res=aaa - 0
res=bbb - 2
res=aaa - 3

Array
(
    [0] => aaa
    [2] => bbb
    [3] => aaa
)


Mais notez que cela ne fonctionnera pas dans les situations où vous êtes celui qui spécifie l'index ...

2
Pascal MARTIN

Sur les tableaux avec des touches numériques de 0 à n-1, j'utilise toujours:

$key = array_Push($array, $value)-1;

Cela ne devient pas plus rapide ou plus simple, je suppose. Si quelqu'un a quelque chose comme ça qui fonctionne pour d'autres tableaux, faites le moi savoir.

1

Bah, on dirait que j'ai trouvé la réponse par moi-même:

$last_id = array_pop(array_keys($a));
0
Christian