PHP получает индекс последнего вставленного элемента в массив - программирование
Подтвердить что ты не робот

PHP получает индекс последнего вставленного элемента в массив

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

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

Пишет:

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

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

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

Пишет:

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 ошибочно.

4b9b3361

Ответ 1

Вот linear (самое быстрое) решение:

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

Ответ 2

Вы можете использовать ключ ($ a) вместе с end ($ а)

$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

Ответ 3

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

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

Кредит отправляется хольску в комментарии.

Ответ 4

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

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

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

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

Вы получите:

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

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


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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

Если вы хотите, чтобы индекс просто получил последний вставленный элемент.

Используя функцию, просто используйте:

return $array[] = $value;