Obtener la primera clave en una matriz asociativa (posiblemente)?

¿Cuál es la mejor manera de determinar la primera clave en una matriz posiblemente asociativa? Lo primero que pensé fue para hacer avanzar el arreglo e inmediatamente romperlo, así:

foreach ($an_array as $key => $val) break; 

Por lo tanto, tener $ key contiene la primera clave, pero parece ineficaz. ¿Alguien tiene una solución mejor?

Puedes usar reset y key :

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

Es esencialmente lo mismo que tu código inicial, pero con un poco menos sobrecarga, y es más obvio lo que está sucediendo.

Solo recuerde llamar al reset , o puede obtener cualquiera de las teclas en la matriz. También puede usar end lugar de reset para obtener la última clave.

Si quería que la clave obtuviera el primer valor, reset realmente lo devuelve:

 $first_value = reset($array); 

Sin embargo, hay un caso especial a tener en cuenta (así que primero verifique la longitud del conjunto):

 $arr1 = array(false); $arr2 = array(); var_dump(reset($arr1) === reset($arr2)); // bool(true) 

array_keys devuelve una matriz de claves. Toma la primera entrada. Alternativamente, puede llamar a reset en la matriz, y luego key . 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.

Curiosamente, el ciclo foreach es en realidad la forma más eficiente de hacerlo.

Dado que el OP específicamente preguntó acerca de la eficiencia, debe señalarse que todas las respuestas actuales son de hecho mucho menos eficientes que las de un foreach.

Hice un punto de referencia en 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 incluso más lentos que eso y empeoran mucho más cuando se trabaja con una gran matriz.

Foreach no es ineficiente en absoluto, ¡siéntete libre de usarlo!

Editar 2015-03-03:

Los scripts de referencia se han solicitado, no tengo los originales, pero realicé algunas pruebas nuevas. Esta vez encontré el foreach solo el doble de rápido que reset / key. Usé 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 de la referencia simple:

 $array = []; for($i=0; $i < 100; $i++) $array["key$i"] = $i; for($i=0, $start = microtime(true); $i < 1000000; $i++) { foreach ($array as $firstKey => $firstValue) { break; } } echo "foreach to get first key and value: " . (microtime(true) - $start) . " seconds 
"; for($i=0, $start = microtime(true); $i < 1000000; $i++) { $firstValue = reset($array); $firstKey = key($array); } echo "reset+key to get first key and value: " . (microtime(true) - $start) . " seconds
"; for($i=0, $start = microtime(true); $i < 1000000; $i++) { reset($array); $firstKey = key($array); } echo "reset+key to get first key: " . (microtime(true) - $start) . " seconds
"; for($i=0, $start = microtime(true); $i < 1000000; $i++) { $firstKey = array_keys($array)[0]; } echo "array_keys to get first key: " . (microtime(true) - $start) . " seconds
";

En mi php 5.5 esto produce:

 foreach to get first key and value: 0.15501809120178 seconds reset+key to get first key and value: 0.29375791549683 seconds reset+key to get first key: 0.26421809196472 seconds array_keys to get first key: 10.059751987457 seconds 

reset + key http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs

key($an_array) le dará la primera clave

editar por Blixt: debe llamar a reset($array); before key($an_array) para restablecer el puntero al comienzo de la matriz.

 list($firstKey) = array_keys($yourArray); 

Si la eficiencia no es tan importante para usted, puede usar array_keys($yourArray)[0] en PHP 5.4 (y superior).

Ejemplos:

 # 1 $arr = ["my" => "test", "is" => "best"]; echo array_keys($arr)[0] . "\r\n"; // prints "my" # 2 $arr = ["test", "best"]; echo array_keys($arr)[0] . "\r\n"; // prints "0" # 3 $arr = [1 => "test", 2 => "best"]; echo array_keys($arr)[0] . "\r\n"; // prints "1" 

La ventaja sobre la solución:

 list($firstKey) = array_keys($yourArray); 

es que puede pasar array_keys($arr)[0] como parámetro de función (es decir, doSomething(array_keys($arr)[0], $otherParameter) ).

HTH

 $myArray = array( 2 => '3th element', 4 => 'first element', 1 => 'second element', 3 => '4th element' ); echo min(array_keys($myArray)); // return 1 

Por favor encuentre lo siguiente:

 $yourArray = array('first_key'=> 'First', 2, 3, 4, 5); $keys = array_keys($yourArray); echo "Key = ".$keys[0]; 

Creo que esto funcionará

Tu podrías intentar

 array_keys($data)[0] 

Esto también podría ser una solución.

 $first_key = current(array_flip($array)); 

Lo he probado y funciona.

  $arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3'); list($first_key) = each($arr); print $first_key; // key1 

La mejor manera que funcionó para mí fue

 array_shift(array_keys($array)) 

array_keys obtiene una matriz de claves de la matriz inicial y, a continuación, array_shift matriz de su primer valor de elemento. Necesitarás PHP 5.4+ para esto.

Para mejorar la solución de Webmut , agregué la siguiente solución:

 $firstKey = array_keys(array_slice($array, 0, 1, TRUE))[0]; 

La salida para mí en PHP 7.1 es:

 foreach to get first key and value: 0.048566102981567 seconds reset+key to get first key and value: 0.11727809906006 seconds reset+key to get first key: 0.11707186698914 seconds array_keys to get first key: 0.53917098045349 seconds array_slice to get first key: 0.2494580745697 seconds 

Si hago esto para una matriz de tamaño 10000, entonces los resultados se vuelven

 foreach to get first key and value: 0.048488140106201 seconds reset+key to get first key and value: 0.12659382820129 seconds reset+key to get first key: 0.12248802185059 seconds array_slice to get first key: 0.25442600250244 seconds 

El método array_keys expira en 30 segundos (con solo 1000 elementos, el tiempo para el rest fue aproximadamente el mismo, pero el método array_keys tuvo aproximadamente 7.5 segundos).

Un trazador de líneas:

 $array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3'); echo key( array_slice( $array, 0, 1, true ) ); # echos 'key1' 

Puedes probar esto. Para obtener el primer valor de la matriz: –

  'bar', 'hello' => 'world'); var_dump(current($large_array)); ?> 

Para obtener la primera clave de la matriz

  'bar', 'hello' => 'world'); $large_array_keys = array_keys($large_array); var_dump(array_shift($large_array_keys)); ?> 

Puedes jugar con tu matriz

 $daysArray = array('Monday', 'Tuesday', 'Sunday'); $day = current($transport); // $day = 'Monday'; $day = next($transport); // $day = 'Tuesday'; $day = current($transport); // $day = 'Tuesday'; $day = prev($transport); // $day = 'Monday'; $day = end($transport); // $day = 'Sunday'; $day = current($transport); // $day = 'Sunday'; 

Para obtener el primer elemento de la matriz puede usar current y para el último elemento puede usar end

Esta es la forma más fácil que he encontrado. Rápido y solo dos líneas de código 😀

 $keys = array_keys($array); echo $array[$keys[0]]; 

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.

  $data = $request->request->all(); dump($data); while ($test = current($data)) { dump($test); echo key($data).'
';die(); break; }

Tal vez será eco 15min de otro tipo. CYA.