sumar recorrer manejo ejemplos columna asociativo array php arrays

php - manejo - recorrer array asociativo javascript



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

¿Cuál es la mejor manera de determinar la primera clave en una matriz posiblemente asociativa? La primera vez que lo pensé fue en buscar el conjunto y luego romperlo 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?


Curiosamente, el bucle foreach es en realidad la forma más eficiente de hacer esto.

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

Hice un punto de referencia en este punto con PHP 5.4, y el método de reinicio / puntero clave (respuesta aceptada) parece ser aproximadamente 7 veces más lento que un foreach. Otros enfoques que manipulan la matriz completa (array_keys, array_flip) son obviamente incluso más lentos y se vuelven mucho peores cuando se trabaja con una matriz grande.

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

Edición 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 la tecla reset /. 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 del simple punto de referencia:

$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 <br />"; 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 <br />"; 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 <br />"; 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 <br />";

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


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

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


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

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

Lo he probado y funciona.


Hoy tuve que buscar la primera clave de mi matriz devuelta por una solicitud POST. (Y tenga en cuenta el número para un ID de formulario, etc.)

Bueno, he encontrado esto: Devolver la primera clave de la matriz asociativa en PHP

key

He hecho esto, y funciona.

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

Tal vez sea eco 15min de otro tipo. CYA.


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 luego array_shift corta de ella el primer valor del elemento. Necesitarás PHP 5.4+ para esto.


Para mejorar la solución de Webmut , he agregado 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, los resultados se convierten en

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 agota el tiempo de espera de 30 segundos (con solo 1000 elementos, el tiempo para el resto fue aproximadamente el mismo, pero el método array_keys tuvo aproximadamente 7.5 segundos).


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á.


Puedes jugar con tu array

$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

Editar

Solo por el bien de no obtener más votos array_keys para la respuesta, puede convertir su clave en valor con array_keys y usar como se muestra arriba.


Puedes usar reset y key :

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

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 que debe reset llamada, o puede obtener cualquiera de las claves de la matriz. También puedes usar end lugar de reset para obtener la última clave.

Si deseaba que la clave obtuviera el primer valor, el reset realmente lo devuelve:

$first_value = reset($array);

Sin embargo, hay que tener en cuenta un caso especial (compruebe primero la longitud de la matriz):

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


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 un parámetro de función (es decir, doSomething(array_keys($arr)[0], $otherParameter) ).

HTH


Tu podrías intentar

array_keys($data)[0]


Una sola línea:

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


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


key($an_array) te dará la primera clave

Edición por Blixt: debe llamar a reset($array); antes de la key($an_array) para restablecer el puntero al principio de la matriz.


Para 2018+

Comenzando con PHP 7.3, hay una función array_key_first() que logra exactamente esto:

$array = [''foo'' => ''lorem'', ''bar'' => ''ipsum'']; $firstKey = array_key_first($array); echo $firstKey; // ''foo''

La documentación está disponible here . 😉


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


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


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