Pregunta 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?


639
2018-06-22 18:13


origen


Respuestas:


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

Si quería la clave para obtener el primer valor, reset en realidad 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)

1135
2018-06-22 18:16



array_keys devuelve una matriz de llaves. Toma la primera entrada. Alternativamente, puedes llamar 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.


66
2018-06-22 18:15



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 se vuelven mucho peor 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 <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

restablecer + tecla http://3v4l.org/b4DrN/perf#tabs
para cada http://3v4l.org/gRoGD/perf#tabs


47
2018-01-19 16:47



key($an_array) te dará la primera clave

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


33
2018-06-22 18:16



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

21
2018-04-12 13:38



Si la eficiencia no es tan importante para ti, puedes 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 puedes pasar array_keys($arr)[0] como un parámetro de función (es decir doSomething(array_keys($arr)[0], $otherParameter))

HTH


19
2018-04-25 20:45



Tu podrías intentar

array_keys($data)[0]

15
2017-11-06 11:42



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

11
2018-04-28 07:02



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á


9
2017-12-02 13:43



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

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

Lo he probado y funciona.


8
2017-12-28 07:13