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

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

 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;