while vacio recorrer primer obtener indice imprimir elementos elemento declarar buscar asociativo array agregar php arrays key associative-array

vacio - recorrer array asociativo php



Devuelve la primera clave de la matriz asociativa en PHP (5)

Estoy tratando de obtener la primera clave de una matriz asociativa, sin crear una variable temporal a través de array_keys() o similar, para pasar por referencia. Lamentablemente, tanto reset() como array_shift() toman el argumento de la matriz por referencia, por lo que ninguno parece ser un resultado viable.

Con PHP 5.4 estaré en el cielo; array_keys($array)[0]; , pero desafortunadamente esto por supuesto tampoco es una opción.

Podría crear una función para cumplir con el propósito, pero solo puedo imaginar que hay una mezcla de las funciones array_* de PHP que producirán el resultado deseado en una declaración única , que no se me ocurre o que no se me ocurre.

Asi que:

$array = array(''foo'' => ''bar'', ''hello'' => ''world''); $firstKey = assorted_functions($array); // $firstKey = ''foo''

El motivo de la cláusula "sin referencia" en mi pregunta es solo por el hecho de que asumo que array_keys() será necesario ( si hay una forma de pasar por referencia, por favor, desconecte )

Usaría la key() , pero eso requiere un reset() ya que no estoy seguro de dónde estará el puntero en el momento de esta operación.

Apéndice

Estoy dando seguimiento a una constatación que tuve recientemente: como mencioné en los comentarios, usará la memoria de todos modos, así que si eso es una preocupación, esta pregunta no tiene solución.

$a = range(0,99999); var_dump(memory_get_peak_usage()); // int(8644416) $k = array_keys($a)[0]; var_dump(memory_get_peak_usage()); // int(17168824)

Lo sabía , ya que PHP no tiene tales capacidades de optimización, pero pensó que merecía una mención explícita.

Sin embargo, la brevedad de la respuesta aceptada es agradable, y funcionará si está trabajando con matrices de un tamaño razonable .


¿Qué pasa con el uso de array_slice (en combinación con array_keys para matrices asociativas)?

$a = range(0,999999); var_dump(memory_get_peak_usage()); $k = array_keys(array_slice($a, 0, 1, TRUE))[0]; var_dump(memory_get_peak_usage()); var_dump($k); $k = array_keys($a)[0]; var_dump(memory_get_peak_usage());

Da como salida (al menos conmigo):

int(36354360) int(36355112) int(0) int(72006024) int(0)


Aunque array_shift(array_keys($array)); funcionará, current(array_keys($array)); es más rápido ya que no avanza el puntero interno.

Cualquiera de los dos funcionará.

Actualizar

Como @TomcatExodus notó, array_shift(); espera una matriz pasada por referencia, por lo que el primer ejemplo emitirá un error. Lo mejor es quedarse con current();


Puedes usar reset y key :

reset( $array ); $first_key = key( $array );

o puedes usar una función:

function firstIndex($a) { foreach ($a as $k => $v) return $k; } $key = firstIndex( $array );


each() aún es una sobrecarga temporal requerida, pero potencialmente mucho menor que el uso de array_keys() .


array_shift(array_keys($array))