Это так же просто, как название звучит; Мне нужно получить индекс / ключ последнего вставленного элемента. Почему это сложно? См. Следующие два примера кода:
$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
ошибочен.
Вот линейное ( самое быстрое ) решение:
end($a); $last_id=key($a);
Вы можете использовать ключ ($ 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
Вы можете использовать функцию end (), чтобы получить последний элемент в массиве, и array_keys (), чтобы вернуть массив ключей массива. Смешение. На практике он работает следующим образом:
$key = end(array_keys($array));
Кредит отправляется в Хольск в комментарии.
Если вы работаете только с числовыми индексами для вашего массива, последний автоматически сгенерированный индекс всегда будет самым большим массивом ключей массива.
Таким образом, для автоматически генерируемых индексов должно работать что-то вроде 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 )
Но обратите внимание, что это не будет работать в ситуациях, когда вы указываете индекс …
Ба, похоже, я нашел ответ сам:
$last_id = array_pop(array_keys($a));
На массивах с числовыми клавишами от 0 до n-1 я всегда использую:
$key = array_push($array, $value)-1;
Думаю, это не получается быстрее или проще. Если у кого-то есть что-то вроде этого, которое работает для других массивов, пожалуйста, дайте мне знать.
Если вы хотите, чтобы индекс просто получил последний вставленный элемент.
Используя функцию, просто используйте:
return $array[] = $value;