2010-07-18 15 views
46

Es tan fácil como suena el título; Necesito obtener el índice/clave del último ítem insertado. ¿Por qué es esto difícil? Consulte los siguientes dos ejemplos de código:PHP obtiene el índice del último elemento insertado en el conjunto

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

escribe:

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

Claro, que parece funcionar bien, pero ver esto:

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

escribe:

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

En resumen, la solución popular count($array)-1 es defectuoso.

Respuesta

61

Aquí está una (la más rápida ) solución linear:

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

Esto es de hecho más rápido. – Christian

+1

¡Es bueno! ¿Es 'end ($)' necesario si usa '[]'? Me he dado cuenta de que también funciona sin él –

+2

Desafortunadamente, sí. Una simple prueba muestra que la operación '$ array [] = $ value;' no establece el puntero interno de la matriz al final. se queda donde el último 'reset',' next', 'end' u operación similar lo configuró, o en la posición 0 si se trata de una nueva matriz con nuevos valores agregados. – SWilk

18

Puede usar la función end() para obtener el último elemento de una matriz y array_keys() para devolver una matriz de las teclas de matriz. Confuso. En la práctica, funciona así:

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

El crédito va a hollsk en los comentarios.

+0

que devuelve el valor, no el índice. Con una matriz con múltiples valores no únicos, esto no puede funcionar. – Christian

+6

Por supuesto que puede. $ key = end (array_keys ($ array)); – hollsk

+8

-1 No debe pasar un valor a 'fin'. Esto levanta una advertencia estricta. La respuesta correcta es la dada por VolkerK: 'end ($ array); clave ($ array); '. – Artefacto

1

Bah, parece que he encontrado la respuesta por mí mismo:

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

¿Estás seguro de que esto es lo que quieres? array_pop sacará el elemento de la matriz y luego devolverá su valor, que tal vez no sea útil si necesita la matriz completa para cualquier otra cosa más adelante. final con array_keys hará lo que quieras mientras dejas intacta tu matriz. – hollsk

+0

Eso funciona en una matriz diferente de $ a. array_keys() devuelve una nueva matriz, y puedo hacer lo que quiera con ella, ya que esta matriz es completamente temporal. Tal vez debería consultar la documentación en array_keys()? – Christian

+1

Esto desencadena un mensaje 'E_STRICT' ya que' array_pop() 'requiere que una variable pase por referencia. – MrWhite

2

Si sólo está trabajando con índices numéricos de la matriz, el último índice generada automáticamente siempre será el más grande de los arrays de la matriz

Por lo tanto, para índices autogenerados, usar algo como max(array_keys($a)) debería funcionar.

Por ejemplo, esto:

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

le conseguiría:

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

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


Pero tenga en cuenta que esto no va a funcionar para situaciones en las que usted es el que especifica el índice ...

+0

Por eso proporcioné el segundo ejemplo. Especifiqué claramente que existe la posibilidad de que las teclas se configuren, sean enteros o no. Lo siento mejor suerte la próxima vez ;-) – Christian

+0

Bueno, funciona, con su segundo ejemplo ;-) ;; pero, OK, solo está funcionando porque ha agregado un índice numérico con el valor "correcto" :-( –

19

Puede usar key($a) junto con 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"; 
} 

impresiones

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

en matrices con las teclas numéricas de 0 a N-1 siempre uso:

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

No obtiene una y más rápido o más simple, supongo. Si alguien tiene algo como esto que funciona para otras matrices, por favor avíseme.

+0

Er ... acabo de leer las otras respuestas .. – Christian

+1

Sé que no se ajusta a sus necesidades especiales, pero vine aquí de la búsqueda de Google y pensé que alguien más vendría aquí de la misma manera sería p arrendado para encontrarlo;) – Christoph

+1

-1 Esta respuesta es incorrecta. 'array_push' devuelve el nuevo ** recuento ** de elementos en la matriz. Su método solo funcionará si no faltan claves. – Twifty

0

Si desea el índice solo para obtener el último elemento insertado.

Utilizando una función, sólo tiene que utilizar:

return $array[] = $value; 
+0

Esto no funciona, como muestra mi código de ejemplo anterior. Esa expresión devolverá el valor, no la clave. También lo probé, en caso de que me falta algo: https://3v4l.org/96q2t – Christian

Cuestiones relacionadas