¿Cómo puedo obtener la última clave de una matriz?
¿Cómo puedo obtener la última clave de una matriz?
Respuestas:
Una solución sería usar una combinación de end
y (citando) :key
end()
avanza el puntero interno de la matriz al último elemento y devuelve su valor. key()
devuelve el elemento índice de la posición actual de la matriz. Entonces, una porción de código como este debería hacer el truco:
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
end($array); // move the internal pointer to the end of the array
$key = key($array); // fetches the key of the element pointed to by the internal pointer
var_dump($key);
Saldrá:
string 'last' (length=4)
es decir, la clave del último elemento de mi matriz.
Una vez hecho esto, el puntero interno de la matriz estará al final de la matriz. Como se señaló en los comentarios, es posible que desee ejecutar reset()
en la matriz para que el puntero regrese al comienzo de la matriz.
reset()
) ; pero tienes razón al señalar esa función, que podría ser útil.
array('a', 'b', 'c', 'd', 'a')
devolverá la clave 0 en lugar de 4.
Aunque end()
parece ser el más fácil, no es el más rápido. La alternativa más rápida y mucho más fuerte es array_slice()
:
$lastKey = key(array_slice($array, -1, 1, true));
Como dicen las pruebas , en una matriz con 500000 elementos, ¡es casi 7 veces más rápido!
end($arr);$key = key($arr);reset($arr);
con (b) $key = key(array_slice($arr,-1,1,true));
... ¡lo que resultó en end()
MUCHO más rápido! end () = 0.05326 segundos, array_slice = 8.506 segundos ... ¿eh?
end()
es más rápido porque puede derivarse de una función C muy simple, como:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
last
al último elemento. Haciendo más end()
o menos O (1). :-)
yo prefiero
end(array_keys($myarr))
end((array_keys($myarr)))
para evitar el aviso.
Desde PHP 7.3 (2018) hay (finalmente) una función para esto: http://php.net/manual/en/function.array-key-last.php
$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )
saldrá
orange
Solo usa : echo $array[count($array) - 1];
int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
que es interesante pero no es bueno para los negocios cuando tienes poco presupuesto
$a[1] = 1; $a[5] = 5; $a[0] = 0;
Entonces tendrá una matriz con las teclas (1, 5, 0), en ese orden. count($a)
rendirá 3 y $a[2]
no está definido. Ciertamente no te devuelve 5.
No sé si esto va a ser más rápido o no, pero parece más fácil hacerlo de esta manera, y evita el error al no pasar una función para finalizar () ...
solo necesitaba una variable ... no es un gran problema para escribir una línea más de código, luego desarmarla si fuera necesario.
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
$keys = array_keys($array);
$last = end($keys);
A partir de PHP7.3 , puede acceder directamente a la última clave en (el nivel externo de) una matriz con array_key_last ()
El definitivamente pone gran parte del debate en esta página a la cama. Es, sin lugar a dudas, el mejor intérprete, no sufre efectos secundarios y es una técnica directa, intuitiva y de una sola llamada para entregar exactamente lo que esta pregunta busca.
Un punto de referencia aproximado como prueba: https://3v4l.org/hO1Yf
array_slice() + key(): 1.4 end() + key(): 13.7 array_key_last(): 0.00015
* La matriz de prueba contiene 500000 elementos, el microtiempo se repite 100 veces, luego se promedia y luego se multiplica por 1000 para evitar la notación científica. Gracias a @MAChitgarha por el punto de referencia inicial comentado bajo la respuesta de @ TadejMagajna .
Esto significa que puede recuperar el valor de la clave final sin:
Esta función se había retrasado mucho tiempo y era una adición bienvenida al cinturón de herramientas de la función de matriz que mejora el rendimiento, evita los efectos secundarios no deseados y permite un código limpio / directo / intuitivo.
Aquí hay una demostración :
$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
echo "please upgrade to php7.3";
} else {
echo "First Key: " , key($array) , "\n";
echo "Last Key: " , array_key_last($array) , "\n";
next($array); // move array pointer to second element
echo "Second Key: " , key($array) , "\n";
echo "Still Last Key: " , array_key_last($array);
}
Salida:
First Key: a
Last Key: c // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c // <-- unaffected by the pointer position, NICE!
Algunas notas:
array_key_last()
es la función hermana de array_key_first () .null
si la matriz está vacía.array_value_first()
& array_value_last()
) también habrían ofrecido el acceso ignorante del puntero a los elementos de sujetalibros, pero evidentemente no lograron obtener suficientes votos para cobrar vida.Aquí hay algunas páginas relevantes que discuten las nuevas características:
ps Si alguien está evaluando algunas de las otras técnicas, puede consultar esta pequeña colección de comparaciones: ( Demo )
Duration of array_slice() + key(): 0.35353660583496 Duration of end() + key(): 6.7495584487915 Duration of array_key_last(): 0.00025749206542969 Duration of array_keys() + end(): 7.6123380661011 Duration of array_reverse() + key(): 6.7875385284424 Duration of array_slice() + foreach(): 0.28870105743408
Intente usar la función array_pop y array_keys de la siguiente manera:
<?php
$array = array(
'one' => 1,
'two' => 2,
'three' => 3
);
echo array_pop(array_keys($array)); // prints three
?>
array_pop()
opera en el valor de retorno de array_keys()
y no en la matriz original.
A partir de PHP> = 7.3 array_key_last()
es la mejor manera de obtener la última clave de cualquiera de una matriz. Usar la combinación de end()
, key()
y reset()
solo para obtener la última clave de una matriz es indignante.
$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3
compara eso con
end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)
Debe restablecer la matriz para que el puntero esté al principio si está utilizando una combinación de end()
ykey()
También me gustaría ofrecer una solución alternativa a este problema.
Suponiendo que todas sus claves son numéricas sin espacios, mi método preferido es contar la matriz y luego menos 1 a partir de ese valor (para tener en cuenta el hecho de que las claves de la matriz comienzan en 0.
$array = array(0=>'dog', 1=>'cat');
$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];
var_dump($lastKey);
print_r($lastKeyValue);
Esto te daría:
int (1) gato
Puedes usar esto:
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array);
echo key($array);
Otra solución es crear una función y usarla:
function endKey($array){
end($array);
return key($array);
}
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
Prueba este con array_reverse()
.
$arr = array(
'first' => 01,
'second' => 10,
'third' => 20,
);
$key = key(array_reverse($arr));
var_dump($key);
$array = array(
'something' => array(1,2,3),
'somethingelse' => array(1,2,3,4)
);
$last_value = end($array);
$last_key = key($array); // 'somethingelse'
Esto funciona porque PHP mueve su puntero de matriz internamente para $ array
La mejor solución posible que también se puede usar en línea:
end($arr) && false ?: key($arr)
Esta solución es solo expresión / declaración y proporciona buena no es el mejor rendimiento posible.
Ejemplo de uso en línea:
$obj->setValue(
end($arr) && false ?: key($arr) // last $arr key
);
ACTUALIZACIÓN: En PHP 7.3+: use (por supuesto) el array_key_last()
método recién agregado .