Tengo una matriz:
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
Me gustaría obtener el primer elemento de esta matriz. Resultado esperado: cadena apple
Un requisito: no se puede hacer pasando por referencia , por array_shift
lo que no es una buena solución.
¿Cómo puedo hacer esto?
&$array
como parámetros.Respuestas:
Respuesta original, pero costosa (O (n)):
En O (1):
Otros casos de uso, etc.
Si modificar (en el sentido de restablecer los punteros de matriz) de
$array
no es un problema, puede usar:Esto debería ser teóricamente más eficiente, si se necesita una "copia" de matriz:
Con PHP 5.4+ (pero puede causar un error de índice si está vacío):
fuente
list()
yreset()
son soluciones mucho mejores para mi opinión.Como Mike señaló (la forma más fácil posible):
Si desea obtener la clave: (ejecútela después de restablecer)
De la documentación de PHP :
Descripción:
fuente
foreach
conjunto de temas, lo arruinarás.foreach
copiará la matriz que está recorriendo.key($arr)
y obtendrá '4' (agregado en la respuesta)reset()
. 2) No, foreach NO crea una copia de una matriz !!! Solo crea su propio puntero (ni siquiera una copia de uno existente; también es fácil de verificar, llamandonext()
antes de foreach).fuente
Si no desea perder la posición actual del puntero, simplemente cree un alias para la matriz.
fuente
reset()
ya devuelve el primer elemento, por lo que no hay necesidad de usarlocurrent()
-echo reset($arr)
debería ser suficientecurrent
parareset
evitar PHP aviso / error se produce en los casos de referencia, por ejemplo,current(array_filter(...));
en 3v4l .current($array)
puede obtener el primer elemento de una matriz, de acuerdo con el manual de PHP .Por lo tanto, funciona hasta que haya reubicado el puntero de la matriz, y de lo contrario tendrá que restablecer la matriz.
fuente
current($array)
solo funcionará si el puntero de la matriz está "actualmente" apuntando al primer elemento; de lo contrario,reset($array)
sería necesario.current()
ya no requiere una referencia, aunque los documentos PHP no reflejan esto. Así que creo que esta se ha convertido en la mejor solución.Puede obtener el enésimo elemento con una construcción de lenguaje, "lista":
Con la
array_keys
función puede hacer lo mismo para las teclas:fuente
list($first_value) = $my_array;
en mi opinión, la mejor opción. No tiene los problemas de las otras respuestas presentadas aquí: no "overkill" porque no copia ni la matriz ni crea una nueva. Sin "referencias": la matriz no se modifica. No "reset": no hay cambios en el puntero interno de la matriz ...int
, intente hacerlolist($firstItem) = array('key1' => 'value1');
y obtendrá un errorNotice: Undefined offset: 0
list($x) = foo();
es equivalente a$x = foo()[0];
. Tenga en cuenta que esto no es necesariamente lo mismo que "obtener el primer elemento", ya que incluso una matriz indexada con enteros puede no tener un elemento con la clave 0. En mi caso, estaba haciendo "list ($ order) = get_order ($ user) ; " pero "get_order" estaba devolviendo pedidos marcados por su ID, que generalmente no era 0. Como dice @Sergiy, array_values () corrige esto, pero resta valor a la eficiencia y (más importante) legibilidad del código.PHP 5.4+:
fuente
$array_values = array_values($array); $value = $array_values[0];
PHP 7.3 agregó dos funciones para obtener la primera y la última clave de una matriz directamente sin modificar la matriz original y sin crear ningún objeto temporal:
Además de ser semánticamente significativas, estas funciones ni siquiera mueven el puntero de matriz (como
foreach
lo haría).Teniendo las claves, uno puede obtener los valores directamente mediante las claves.
Ejemplos (todos ellos requieren PHP 7.3+)
Obteniendo la primera / última clave y valor:
Obteniendo el primer / último valor como líneas simples, suponiendo que la matriz no puede estar vacía :
Obteniendo el primer / último valor como líneas simples, con valores predeterminados para matrices vacías:
fuente
$first_value = $my_array[array_key_first($my_array)] ?? null;
Suponer:
Solo usa:
para obtener el primer elemento o
para obtener la primera clave.
O puede desvincular el primero si desea eliminarlo.
fuente
current
entonces?Algunas matrices no funcionan con funciones como
list
,reset
ocurrent
. Tal vez son matrices "falsas", implementando parcialmente ArrayIterator, por ejemplo.Si desea extraer el primer valor independientemente de la matriz, puede provocar un cortocircuito en un iterador:
Su valor estará disponible en
$value
y el bucle se romperá después de la primera iteración. Esto es más eficiente que copiar una matriz potencialmente grande a una función como array_unshift (array_values ($ arr)).También puedes tomar la llave de esta manera:
Si está llamando a esto desde una función, simplemente regrese temprano:
fuente
De los ayudantes de Laravel :
La matriz que se pasa por valor a la función, reset () afecta el puntero interno de una copia de la matriz y no toca la matriz original (tenga en cuenta que devuelve
false
si la matriz está vacía).Ejemplo de uso:
Además, aquí hay una alternativa. Es marginalmente más rápido, pero más interesante. Permite cambiar fácilmente el valor predeterminado si la matriz está vacía:
Para el registro, aquí hay otra respuesta mía , para el último elemento de la matriz.
fuente
¡Mantén esto simple! Aquí hay muchas respuestas correctas, pero para minimizar toda la confusión, estas dos funcionan y reducen muchos gastos generales:
key($array)
obtiene la primera clave de una matrizcurrent($array)
obtiene el primer valor de una matrizEDITAR: con
respecto a los comentarios a continuación. Se mostrará el siguiente ejemplo:
string(13) "PHP code test"
fuente
current
es igual al elemento actual Debe restablecer el puntero al comienzo de la matriz para asegurarse de que realmente esté al principio.Simplemente haz:
fuente
Haría
echo current($array)
.fuente
current()
no da error cuando se pasan no referencias. Siempre que el puntero todavía esté al principio, esto funciona.reset
produce el aviso "Solo las variables deben pasarse por referencia", mientrascurrent
que no: Ejemplo del Editor PHP en línea decurrent(array_filter(...));
.next()
,end()
o cualquier otra función que modifique el puntero interno de la matriz. En mi ejemplo,current()
devuelve nulo porque el puntero interno está "fuera del rango" de la matriz. Pero puede 'virtualmente' apuntar a cualquier elemento / aleatorio también.Salida:
fuente
fuente
Esto es mucho más eficiente que
array_values()
porque laeach()
función no copia toda la matriz.Para obtener más información, consulte http://www.php.net/manual/en/function.each.php
fuente
because the each() function does not copy the entire array.
+1Una forma grosera es:
fuente
reset()
ya que el puntero de matriz se reinicia antes de queforeach
se llame de todos modos.Obtén el primer elemento:
Obtener el último elemento
fuente
La mayoría de estos trabajos! PERO para una llamada rápida de una sola línea (bajo recurso):
Aunque esto funciona, y decentemente bien, también vea mi respuesta adicional: https://stackoverflow.com/a/48410351/1804013
fuente
current($array)
, que requiere que el puntero interno de la matriz esté en el primer elemento de todos modos, en cuyo caso,echo reset($array)
es el más apropiado.Creo que usar array_values sería tu mejor apuesta aquí. Podría devolver el valor en el índice cero del resultado de esa función para obtener 'apple'.
fuente
Esto es un poco tarde para el juego, pero me presentaron un problema en el que mi matriz contenía elementos de matriz como elementos secundarios dentro de ella, y por lo tanto no podía obtener una representación de cadena del primer elemento de matriz. Al usar la
current()
función de PHP , logré esto:Gracias a todas las soluciones actuales me ayudaron a llegar a esta respuesta, ¡espero que esto ayude a alguien alguna vez!
fuente
Utilizar:
De manera predeterminada,
array_slice
no conserva las claves, por lo que podemos usar cero de forma segura como índice.fuente
Dos soluciones para ti.
Solución 1 - Solo usa la llave. No has dicho que no puedes usarlo. :)
Solución 2 - array_flip () + key ()
Solución 3 - array_keys ()
fuente
Esta no es una respuesta tan simple en el mundo real. Supongamos que tenemos estos ejemplos de posibles respuestas que puede encontrar en algunas bibliotecas.
Como puede ver, tenemos varias soluciones de 'una línea' que funcionan bien en algunos casos, pero no en todos.
En mi opinión, debe tener ese controlador solo con matrices.
Ahora hablando de rendimiento, suponiendo que siempre tengamos una matriz, como esta:
array_shift
es más rápido quereset
, es más rápido que [count () - 1], y estos tres son más rápidos quearray_values
yarray_slice
.fuente
Me imagino que el autor solo estaba buscando una forma de obtener el primer elemento de una matriz después de obtenerlo de alguna función ( mysql_fetch_row , por ejemplo) sin generar un ESTRICTO "Solo las variables deben pasarse por referencia".
Si es así, casi todas las formas descritas aquí recibirán este mensaje ... y algunas de ellas usan mucha memoria adicional duplicando una matriz (o alguna parte de ella). Una manera fácil de evitarlo es asignar el valor en línea antes de llamar a cualquiera de esas funciones:
De esta manera no obtienes el mensaje ESTRICTO en la pantalla, ni en los registros, y no creas matrices adicionales. Funciona con matrices indexadas y asociativas.
fuente
Me gusta el ejemplo de "lista", pero "lista" solo funciona en el lado izquierdo de una tarea. Si no queremos asignar una variable, nos veríamos obligados a inventar un nombre temporal, que en el mejor de los casos contamina nuestro alcance y en el peor de los casos sobrescribe un valor existente:
Lo anterior sobrescribirá cualquier valor existente de $ x, y la variable $ x se mantendrá mientras este alcance esté activo (el final de esta función / método, o para siempre si estamos en el nivel superior). Esto se puede solucionar usando call_user_func y una función anónima, pero es torpe:
Si usamos funciones anónimas como esta, podemos salir con reset y array_shift, a pesar de que usan paso por referencia. Esto se debe a que llamar a una función vinculará sus argumentos, y estos argumentos se pueden pasar por referencia:
Sin embargo, esto es realmente excesivo, ya que call_user_func realizará esta asignación temporal internamente. Esto nos permite tratar las funciones de paso por referencia como si fueran valores de paso, sin advertencias ni errores:
fuente
Un pequeño cambio en lo que Sarfraz publicó es:
fuente
No me gusta jugar con el puntero interno de la matriz, pero también es ineficiente construir una segunda matriz con
array_keys()
oarray_values()
, por lo que generalmente defino esto:fuente
Prueba esto:
fuente