PHP получить индекс последнего вставленного элемента в массиве - PullRequest
50 голосов
/ 18 июля 2010

Это так же просто, как звучит название; Мне нужно получить индекс / ключ последнего вставленного элемента. Почему это сложно? Смотрите следующие два примера кода:

<code>$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).'
');

Пишет:

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

Конечно, это, кажется, работает нормально, но посмотрите на это:

<code>$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).'
');

Пишет:

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

Короче говоря, популярный обходной путь count($array)-1 имеет недостатки.

Ответы [ 6 ]

67 голосов
/ 06 апреля 2012

Вот решение linear ( fasttest ):

end($a);
$last_id=key($a);
20 голосов
/ 18 июля 2010

Можно использовать клавишу ($ a) вместе с end ($ 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";
}

отпечатками

count: 1 last key: 0
count: 2 last key: 3
count: 3 last key: foo
count: 4 last key: 4
18 голосов
/ 18 июля 2010

Вы можете использовать функцию end () , чтобы получить последний элемент в массиве, и array_keys () , чтобы вернуть массив ключей массива.Смешение.На практике это работает так:

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

В комментариях кредит идет к hollsk.

2 голосов
/ 18 июля 2010

Если вы работаете только с числовыми индексами для вашего массива, последний автоматически сгенерированный индекс всегда будет самым большим ключом массива в массиве.

Таким образом, для автоматически сгенерированных индексов должно работать что-то вроде max(array_keys($a)).

Например, это:

<code>$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).'
');

Получил бы ты:

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

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


Но обратите внимание, что это не будет работать в ситуациях, когда вы указываете индекс ...

1 голос
/ 23 января 2014

На массивах с цифровыми клавишами от 0 до n-1 я всегда использую:

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

Это не становится быстрее или проще, я думаю. Если кто-то получил что-то подобное для других массивов, пожалуйста, дайте мне знать.

0 голосов
/ 18 июля 2010

Бах, похоже, я нашел ответ сам:

$last_id = array_pop(array_keys($a));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...