Okay,
Lo sé todo array_pop()
, pero eso elimina el último elemento. ¿Cuál es la mejor manera de obtener el último elemento de una matriz sin eliminarlo?
EDITAR: Aquí hay una bonificación:
$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
o incluso
$array = array('a', 'b', 'c', 'd');
unset($array[2]);
echo $array[sizeof($array) - 1]; // Output: PHP Notice: Undefined offset: 2 in - on line 4
Respuestas:
Las muchas respuestas en este hilo nos presentan muchas opciones diferentes. Para poder elegir entre ellos, necesitaba comprender su comportamiento y desempeño. En esta respuesta voy a compartir mis resultados con usted, se comparan contra las versiones de PHP
5.6.38
,7.2.10
y7.3.0RC1
( se espera Dic 13 2018 ).Las opciones
<<option code>>
que probaré son:$x = array_values(array_slice($array, -1))[0];
( Como se sugiere por rolacja )$x = array_slice($array, -1)[0];
( según lo sugerido por Stoutie )$x = array_pop((array_slice($array, -1)));
( Como se sugiere por rolacja )$x = array_pop((array_slice($array, -1, 1)));
( Como se sugiere por Westy92 )$x = end($array); reset($array);
( Como se sugiere por Iznogood )$x = end((array_values($array)));
( Como se sugiere por TecBrat )$x = $array[count($array)-1];
( según lo sugerido por Mirko Pagliai )$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
( según lo sugerido por thrau )$x = $array[] = array_pop($array);
( según lo sugerido por el usuario 2782001 )$x = $array[array_key_last($array)];
( como se sugiere por el clon de Quasimodo ; disponible por PHP 7.3)(funciones mencionadas: array_key_last , array_keys , array_pop , array_slice , array_values , count , end , reset )
Las entradas de prueba
<<input code>>
para combinar con:$array = null;
$array = [];
$array = ["a","b","c",null];
$array = ["a","b","c","d"];
$array = []; $array[1] = "a"; $array[2] = "b"; $array[0] = "c";
$array = []; for($i=0;$i<100;$i++) { $array[] = $i; }
$array = []; for($i=0;$i<100000;$i++) { $array[] = $i; }
Para el ensayo de I a utilizar el
5.6.38
,7.2.10
y7.3.0RC1
contenedores acoplables PHP como:Cada combinación de los anteriores figuran
<<option code>>
s y<<input code>>
s se llevará a cabo en todas las versiones de PHP. Para cada prueba ejecutada se utiliza el siguiente fragmento de código:Para cada ejecución, esto variará el último último valor recuperado de la entrada de prueba e imprimirá la duración promedio de una iteración en femtosegundos (0.000000000000001 de segundo).
Los resultados son los siguientes:
La anteriormente mencionada F Atal, W Arning y N Otice códigos traducen como:
En base a este resultado, saco las siguientes conclusiones:
$x = end((array_values($array)));
$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
$x = end($array); reset($array);
$x = $array[count($array)-1];
$x = $array[] = array_pop($array);
$x = $array[array_key_last($array)];
(desde PHP 7.3)$x = $array[count($array)-1];
(debido al uso decount
)$x = $array[] = array_pop($array);
(debido a que el valor asignado pierde la clave original)$x = end($array); reset($array);
$x = end((array_values($array)));
array_key_last
función parece no tener ninguna de las limitaciones mencionadas anteriormente, con la excepción de que todavía es un RC en el momento de escribir este artículo (así que use el RC o espere su lanzamiento en diciembre de 2018):$x = $array[array_key_last($array)];
(desde PHP 7.3)Un poco, dependiendo de si usa la matriz como pila o como cola , puede hacer variaciones en la opción 9.
fuente
$array[array_key_last($array)];
a su punto de referencia. Y por favor dame una notificación cuando hayas terminado. Me gustaría ver los resultados de rendimiento en comparación.Tratar
Para restablecerlo (gracias @hopeseekr):
Enlace al manual
@David Murdoch agregó:
$myLastElement = end(array_values($yourArray));// and now you don't need to call reset().
en E_STRICT esto produce la advertenciaGracias o_O Tync y todos!
fuente
$myLastElement = end(array_values($yourArray));
y ahora no necesita llamarreset()
.end(array_values())
dará un E_STRICT: "Solo las variables deben pasarse por referencia"end((array_values($yourArray)))
Corto y dulce.
Se me ocurrió una solución para eliminar el mensaje de error y preservar la forma única y el rendimiento eficiente:
- solución previa
Nota: Los paréntesis adicionales son necesarios para evitar a
PHP Strict standards: Only variables should be passed by reference
.fuente
$array = array_slice($array, -1); $lastEl = array_pop($array);
personalmente creo que esto es mejor (sin el 'error' del analizador)array_size() > 1
2. Compruebe si la matriz es realmente una matriz. Todavía sigo con la respuesta de @Iznogood ya que laend()
función incorporada de PHP ya hace todo el trabajo duro de una manera más eficiente.¿Qué tiene de malo
array_slice($array, -1)
? (Ver Manual: http://us1.php.net/array_slice )array_slice()
devuelve una matriz Probablemente no sea lo que estás buscando. Tú quieres el elemento.fuente
array_slice($array, -1)[0]
para obtener el elemento.reset(array_slice($array, -1))
es otro enfoque (que no causará un error siarray_slice()
devuelve algo "más pequeño" que una matriz de un solo elemento)array_slice($array, -1)[0] = "";
Una forma de evitar errores de paso por referencia (por ejemplo, "end (array_values ($ foo))" ") es usar call_user_func o call_user_func_array:
fuente
end((array_values($yourArray)))
call_user_func
truco tampoco funciona en PHP 7. Creo que estás atrapado con la creación de una variable temporal.Si no le importa modificar el puntero interno (admite matrices indexadas y asociativas):
Si desea una función de utilidad que no modifique el puntero interno (porque la matriz se pasa por valor y la función opera en una copia de ella):
Tenga en cuenta que PHP produce copias "sobre la marcha", es decir, solo cuando es realmente necesario. El
end()
mismo modifica la matriz, por lo que internamente se genera una copia de la matriz.Por lo tanto, la siguiente alternativa es realmente más rápida ya que internamente no copia la matriz, solo hace un corte:
Este "foreach / return" es un ajuste para obtener de manera eficiente el primer elemento (y aquí solo).
Finalmente, la alternativa más rápida pero solo para matrices indexadas:
Para el registro, aquí hay otra respuesta mía , para el primer elemento de la matriz.
fuente
array_last
función. Para el primero, indica que$array
se copia y para el segundo que no se copia. ¿Dónde está la diferencia / por qué se copia en la primera implementación y no en la segunda?no probado: ¿no funcionaría esto?
Dado que la matriz devuelta por array_values es fugaz, a nadie le importa si se restablece su puntero.
y si necesitas la clave para ir, supongo que lo harías:
fuente
Necesito esto con bastante frecuencia para lidiar con las pilas, y siempre me encuentro desconcertado de que no haya una función nativa que lo haga sin manipular la matriz o su puntero interno de alguna forma.
Por lo tanto, generalmente llevo una función util que también es segura de usar en matrices asociativas.
fuente
Para obtener el último elemento de una matriz, use:
Punto de referencia
Repetí 1,000 veces, agarrando el último elemento de arreglos pequeños y grandes que contenían 100 y 50,000 elementos, respectivamente.
Usé PHP versión 5.5.32.
fuente
end () proporcionará el último elemento de una matriz
fuente
A partir de la versión 7.3 de PHP, se han introducido las funciones
array_key_first
yarray_key_last
.Dado que las matrices en PHP no son tipos de matriz estrictos, es decir, colecciones de tamaño fijo de campos de tamaño fijo que comienzan en el índice 0, sino una matriz asociativa extendida dinámicamente, el manejo de posiciones con claves desconocidas es difícil y las soluciones alternativas no funcionan muy bien. Por el contrario, las matrices reales se abordarían internamente a través de la aritmética del puntero muy rápidamente y el último índice ya se conoce en tiempo de compilación por declaración.
Al menos el problema con la primera y la última posición se resuelve con funciones incorporadas ahora desde la versión 7.3. Esto incluso funciona sin ninguna advertencia en los literales de matriz listos para usar :
Obviamente el último valor es:
fuente
No se realiza ninguna modificación en los punteros de $ array. Esto evita el
que puede no ser deseado en ciertas condiciones.
fuente
Para mi:
Con asociados:
fuente
Las respuestas principales son geniales, pero como lo mencionaron @ paul-van-leeuwen y @ quasimodos-clone, PHP 7.3 introducirá dos nuevas funciones para resolver este problema directamente: array_key_first () y array_key_last () .
Puede comenzar a usar esta sintaxis hoy con las siguientes funciones de polyfill (o shim).
Advertencia: Esto requiere PHP 5.4 o superior.
fuente
Para hacer esto y evitar el E_STRICT y no meterse con el puntero interno de la matriz, puede usar:
lelement solo funciona con una copia, por lo que no afecta el puntero de la matriz.
fuente
Otra solución:
fuente
Una posible solución más ...
fuente
Qué tal si:
$array == []
(regresafalse
)fuente
Obtendrá el último elemento de una matriz fácilmente utilizando la lógica a continuación
No solo el último elemento, sino que también puede obtener el segundo último, el último último, etc., utilizando la lógica a continuación.
para el segundo último elemento, debe pasar solo el número 2 en la declaración anterior, por ejemplo:
echo ($ array [count ($ array) -2]);
fuente
Para obtener el último valor de Array:
Para eliminar la matriz de formulario de último valor:
fuente
array_slice($arr,-1,1)
dará como resultado otra matriz con longitud 1, no el último elemento$a=array("red","green","blue","yellow","brown"); print_r(array_slice($a,-1,1));
Resultado:Array ( [0] => brown )
Simplemente:
$last_element = end((array_values($array)))
No restablece la matriz y no da advertencias ESTRICTAS.
PD. Como la respuesta más votada todavía no tiene el paréntesis doble, presenté esta respuesta.
fuente
Creo que esta es una ligera mejora en todas las respuestas existentes:
end()
o con solucionesarray_keys()
, especialmente con matrices grandesfuente
array_values
en el segmento de un solo elemento)Use la función end ().
fuente
Hoy en día, preferiría tener siempre este ayudante, como se sugiere en una respuesta php.net/end .
Esto siempre mantendrá el puntero como está y nunca tendremos que preocuparnos por paréntesis, estándares estrictos o lo que sea.
fuente
Nota: Para (PHP 7> = 7.3.0) podemos usar array_key_last - Obtiene la última clave de una matriz
Ref: http://php.net/manual/en/function.array-key-last.php
fuente
¿Qué sucede si desea obtener el último elemento de la matriz dentro del bucle de su matriz?
El siguiente código dará como resultado un bucle infinito:
La solución es obviamente simple para matrices no asociativas:
fuente
fuente
A partir de PHP 7.3,
array_key_last
está disponiblefuente
Muy simple
fuente
$a = array(); $a[2] = 'c'; $a[1] = 'b'; echo end($a);
, volveráb
Mi solución simple, bonita y fácil de entender.
fuente