¿Cuál es la mejor manera de determinar la primera clave en una matriz posiblemente asociativa? Lo primero que pensé fue simplemente predecir la matriz y luego romperla de inmediato, así:
foreach ($an_array as $key => $val) break;
Por lo tanto, tener $ key contiene la primera clave, pero esto parece ineficiente. ¿Alguien tiene una solución mejor?
foreach
está semánticamente equivocado.each($arr)['key']
oeach($arr)[0]
funcionaría.0.0107
foreach:0.0217
Respuestas:
Actualización 2019
A partir de PHP 7.3 , hay una nueva función incorporada llamada
array_key_first()
que recuperará la primera clave de la matriz dada sin restablecer el puntero interno. Consulte la documentación para más información.Puedes usar
reset
ykey
:Es esencialmente lo mismo que su código inicial, pero con un poco menos de sobrecarga, y es más obvio lo que está sucediendo.
Solo recuerde llamar
reset
, o puede obtener cualquiera de las claves en la matriz. También puede usar enend
lugar dereset
obtener la última clave.Si desea que la clave obtenga el primer valor, en
reset
realidad lo devuelve:Sin embargo, hay un caso especial a tener en cuenta (así que primero verifique la longitud de la matriz):
fuente
reset()
también sucede que devuelve el primer elemento (valor, no clave) de cualquier matriz, que también puede ser útil.reset()
diceDon't use
reset () `para obtener el primer valor de una matriz asociativa. Funciona muy bien para matrices verdaderas, pero funciona inesperadamente en objetos Iterator. bugs.php.net/bug.php?id=38478 `¿Sigue siendo cierto? Estoy confundidoarray
objetos, sino de objetos personalizados (que no son matrices reales). Supongo que confundieron la diferencia en las estructuras de datos, pero básicamente,reset
devuelve el valor de la primera "clave", que para los objetos estaría$prop
en el ejemplo dado en el informe "error", pero para una matriz la primera clave. Así que no se preocupe, siempre y cuando use matrices reales (creadas conarray(…)
), no tendrá ningún problema.next
,reset
,end
o bucle a través de la matriz), no obtendrá el valor esperado cuando llamekey
. Entonces sí, siempre llamereset
antes de usarkey
para asegurarse de obtener lo que desea.array_keys
devuelve una matriz de claves. Toma la primera entrada. Alternativamente, puede llamarreset
a la matriz y posteriormentekey
. El último enfoque es probablemente un poco más rápido (aunque no lo probé), pero tiene el efecto secundario de restablecer el puntero interno.fuente
foreach
+break
yreset
+ enkey
realidad. Pero el primero parece bastante extraño, por lo que para cuestiones estilísticas, preferiría el segundo.foreach
que no crea una copia interna, sino que simplemente itera un puntero , similar a usar el nivel más bajonext
,current
etc.Curiosamente, el bucle foreach es en realidad la forma más eficiente de hacerlo.
Dado que el OP preguntó específicamente sobre la eficiencia, debe señalarse que todas las respuestas actuales son, de hecho, mucho menos eficientes que un foreach.
Hice un punto de referencia sobre esto con php 5.4, y el método de reinicio / puntero de tecla (respuesta aceptada) parece ser aproximadamente 7 veces más lento que un foreach. Otros enfoques que manipulan toda la matriz (array_keys, array_flip) son obviamente aún más lentos que eso y empeoran mucho cuando se trabaja con una matriz grande.
Foreach no es ineficiente en absoluto, ¡no dudes en usarlo!
Editar 2015-03-03:
Se han solicitado scripts de referencia, no tengo los originales, sino que hice algunas pruebas nuevas. Esta vez encontré el foreach solo el doble de rápido que reset / key. Utilicé una matriz de 100 teclas y ejecuté cada método un millón de veces para obtener una diferencia notable, aquí está el código del punto de referencia simple:
En mi php 5.5 esto produce:
reset + key http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs
fuente
foreach
nunca copie la matriz a menos que la modifique directamente dentro del bucle foreach. En php5, la estructura de la matriz podría copiarse en algunos casos (cuando su recuento> 1) y en realidad tiene razón, podría ser una influencia significativa allí. Afortunadamente, no hay nada de qué preocuparse en php7, donde se resolvió este problema. Aquí hay una gran lectura sobre cómo funciona foreach debajo del capó ahora y cómo funcionó en el pasado.key($an_array)
te dará la primera claveeditar por Blixt: debe llamar
reset($array);
anteskey($an_array)
para restablecer el puntero al comienzo de la matriz.fuente
Tu podrías intentar
fuente
Para 2018+ a
partir de PHP 7.3, hay una
array_key_first()
función que logra exactamente esto:La documentación está disponible aquí . 😉
fuente
fuente
Si la eficiencia no es tan importante para usted, puede usarla
array_keys($yourArray)[0]
en PHP 5.4 (y superior).Ejemplos:
La ventaja sobre la solución:
es que puede pasar
array_keys($arr)[0]
como parámetro de función (es decirdoSomething(array_keys($arr)[0], $otherParameter)
).HTH
fuente
array_keys($arr)[0]
sintaxis es válida?array dereferencing
. Ver por ejemplo: schlueters.de/blog/archives/…Por favor encuentre lo siguiente:
Ejemplo de trabajo
fuente
fuente
max()
dosis no devuelve la primera clave de una matriz de asociación max return valor máximo de una lista o una matriz de elementosEsto también podría ser una solución:
Lo he probado y funciona.
Código de Trabajo .
fuente
Para mejorar la solución de Webmut , he agregado la siguiente solución:
El resultado para mí en PHP 7.1 es:
Si hago esto para una matriz de tamaño 10000, entonces los resultados se convierten
El método array_keys agota el tiempo de espera en 30 segundos (con solo 1000 elementos, el tiempo para el resto fue casi el mismo, pero el método array_keys tuvo aproximadamente 7.5 segundos).
fuente
fuente
La mejor manera que funcionó para mí fue
array_keys
obtiene una matriz de claves de la matriz inicial y luegoarray_shift
corta de ella el primer valor del elemento. Necesitará PHP 5.4+ para esto.fuente
Esta es la forma más fácil que he encontrado. Rápido y solo dos líneas de código :-D
fuente
php73:
http://php.net/manual/en/function.array-key-first.php
fuente
Una frase:
fuente
Hoy tuve que buscar la primera clave de mi matriz devuelta por una solicitud POST. (Y tenga en cuenta el número de un id de formulario, etc.)
Bueno, he encontrado esto: devolver la primera clave de la matriz asociativa en PHP
http://php.net/key
He hecho esto y funciona.
Tal vez sea eco 15min de otro chico. CYA.
fuente
Puedes jugar con tu matriz
Para obtener el primer elemento de la matriz que puede usar
current
y para el último elemento puede usarend
Editar
Solo por el hecho de no obtener más votos por la respuesta, puede convertir su clave en valor usando
array_keys
y usando como se muestra arriba.fuente