¿Cómo obtener el primer elemento de una matriz asociativa de PHP?

146

Si tuviera una matriz como:

$array['foo'] = 400;
$array['bar'] = 'xyz';

Y quería sacar el primer elemento de esa matriz sin saber la clave, ¿cómo haría eso? ¿Hay una función para esto?

Haga clic en Upvote
fuente
(referencia) Matrices y funciones de matriz
Gordon

Respuestas:

288

reset() le da el primer valor de la matriz si tiene un elemento dentro de la matriz:

$value = reset($array);

También te da FALSEen caso de que la matriz esté vacía.

soulmerge
fuente
A tener en cuenta:$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
cwallenpoole
Más información sobre la función de reinicio: www.w3schools.com/php/func_array_reset.asp
Paul Chris Jones
¿Qué pasa si quiero obtener la clave y el valor?
Timberman
51

PHP <7.3

Si no sabe lo suficiente sobre la matriz (no está seguro de si la primera clave es foo o bar ), entonces la matriz también podría estar vacía .

Por lo tanto, sería mejor verificar, especialmente si existe la posibilidad de que el valor devuelto sea el booleano FALSO:

$value = empty($arr) ? $default : reset($arr);

El código anterior usa resety tiene efectos secundarios (restablece el puntero interno de la matriz), por lo que puede preferir usar array_slicepara acceder rápidamente a una copia del primer elemento de la matriz:

$value = $default;
foreach(array_slice($arr, 0, 1) as $value);

Suponiendo que desea obtener tanto la clave como el valor por separado , debe agregar el cuarto parámetro a array_slice:

foreach(array_slice($arr, 0, 1, true) as $key => $value);

Para obtener el primer elemento como un par ( key => value):

$item = array_slice($arr, 0, 1, true);

Modificación simple para obtener el último elemento, clave y valor por separado:

foreach(array_slice($arr, -1, 1, true) as $key => $value);

actuación

Si la matriz no es realmente grande, en realidad no necesita array_slicey puede obtener una copia de toda la matriz de claves, luego obtenga el primer elemento:

$key = count($arr) ? array_keys($arr)[0] : null;

Sin embargo, si tiene una matriz muy grande, la llamada a array_keysrequerirá mucho tiempo y memoria array_slice(ambas funciones recorren la matriz, pero la última termina tan pronto como ha reunido el número requerido de elementos, que es uno).

Una excepción notable es cuando tiene la primera clave que apunta a un objeto muy grande y complicado. En ese caso array_slice, duplicará ese primer objeto grande, mientras array_keysque solo tomará las teclas.

PHP 7.3

PHP 7.3 implementa array_key_first()tan bien como array_key_last(). Estos se proporcionan explícitamente para acceder a las primeras y últimas teclas de manera eficiente sin restablecer el estado interno de la matriz como efecto secundario.

Entonces en PHP 7.3 se puede acceder al primer valor de $arraycon

$array[array_key_first($array)];

Sin embargo, es mejor que compruebe que la matriz no está vacía, o obtendrá un error:

$firstKey = array_key_first($array);
if (null === $firstKey) {
    $value = "Array is empty"; // An error should be handled here
} else {
    $value = $array[$firstKey];
}
LSerni
fuente
@AhmedShefeer, la otra respuesta no es solo la aceptada, sino que ha estado allí durante ocho años más . Estoy recogiendo las migajas aquí :-D. Pero gracias por el voto de confianza!
LSerni
1
Me parece que esta es la mejor respuesta, ya que la única otra no desaprobada que da tanto la clave como el valor es el bucle foreach abortado, que es incómodo. Las otras respuestas dan solo el valor sin la clave.
hollín
1
Me encantó este enfoque moderno y actualizado con el tiempo.
sanjeet bisht
@LSerni No sé si todavía está activo, pero estaba atascado y esta publicación bien explicada y actualizada me salvó. Gracias
izk
@izk siempre estoy activo! :-D
LSerni
44

Fake loop que se rompe en la primera iteración:

$key = $value = NULL;
foreach ($array as $key => $value) {
    break;
}

echo "$key = $value\n";

O use each()( advertencia: en desuso a partir de PHP 7.2.0 ):

reset($array);
list($key, $value) = each($array);

echo "$key = $value\n";
John Kugelman
fuente
2
Probablemente porque reset () es más simple.
mjs
1
Porque la solución está en su primera línea de código pero continúa escribiendo otra línea completamente innecesaria.
markus
21
reset no devolverá la clave
HarryFink
3
+1 para el 'bucle falso'. He necesitado recuperar los primeros elementos clave y valor, sin pasar por cada elemento. La reset()función solo recuperaría el primer valor.
Phil Cross
2
+1 para el bucle falso también, necesito mantener la clave para que reiniciar no sea una opción
isJustMe
25

Hay algunas opciones array_shift()devolverá el primer elemento, pero también eliminará el primer elemento de la matriz.

$first = array_shift($array);

current() devolverá el valor de la matriz a la que apunta su puntero de memoria interna, que es el primer elemento por defecto.

$first = current($array);

Si desea asegurarse de que apunta al primer elemento, siempre puede usarlo reset().

reset($array);
$first = current($array);
Jeremy Ruten
fuente
3
Me gusta esta respuesta como la más completa, pero note en reset()realidad devuelve el elemento, por lo que seguir con a $first = current($array)es redundante.
Tom Auger
9

Solo para que tengamos algunas otras opciones: reset($arr);lo suficientemente bueno si no está tratando de mantener el puntero de la matriz en su lugar, y con matrices muy grandes incurre en una cantidad mínima de sobrecarga. Dicho esto, hay algunos problemas con esto:

$arr = array(1,2);
current($arr); // 1
next($arr);    // 2
current($arr); // 2
reset($arr);   // 1
current($arr); // 1 !This was 2 before! We've changed the array's pointer.

La forma de hacerlo sin cambiar el puntero:

$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));

El beneficio de $arr[reset(array_keys($arr))];es que genera una advertencia si la matriz está realmente vacía.

cwallenpoole
fuente
respuesta muy descriptiva, y significa mucho para los demás. Gracias hombre.
Jigar7521
7

Otra forma fácil y sencilla de hacerlo es usar array_values

array_values($array)[0]
Principiante
fuente
reset()es una opción mucho mejor ya que devuelve falso si la matriz está vacía. su solución no funcionará, por ejemplo, en la pregunta
Northys
1
En PHP 7+, algo como esto funcionaría:array_values($array)[0] ?? FALSE
MarthyM
4

Pruebe si la variable es una matriz antes de obtener el primer elemento. Al crear dinámicamente la matriz si está configurada como nula, se obtiene un error.

Por ejemplo:

if(is_array($array))
{
  reset($array);
  $first = key($array);
}
w3bMak3r
fuente
3

Podemos hacer $first = reset($array);

En vez de

reset($array);
$first = current($array);

Como reset()

devuelve el primer elemento de la matriz después de reiniciar;

Suryasish Dey
fuente
2

Puedes hacer:

$values = array_values($array);
echo $values[0];
d0niek
fuente
2

Use la función reset () para obtener el primer elemento de esa matriz sin conocer la clave de esta manera.

$value = array('foo' => 400, 'bar' => 'xyz');
echo reset($value);

salida // 400

Wakar Ahmad Khan
fuente
2

Puedes probar esto.

Para obtener el primer valor de la matriz: -

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   var_dump(current($large_array));
?>

Para obtener la primera clave de la matriz

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   $large_array_keys = array_keys($large_array);
   var_dump(array_shift($large_array_keys));
?>
Caminar
fuente
1

Podrías usar array_shift

Cesar
fuente
44
Pero tenga en cuenta que la matriz tendrá un elemento eliminado.
desafío
1

Hago esto para obtener el primer y último valor. Esto funciona con más valores también.

$a = array(
    'foo' => 400,
    'bar' => 'xyz',
);
$first = current($a);   //400
$last = end($a);    //xyz
Daantje
fuente
Esto solo funciona cuando el puntero interno está en el primer elemento. Si bien esto es bueno porque no restablece la posición del puntero, solo funciona cuando el puntero ya está en reposo.
cjc
1

Comenzando con PHP 7.3.0 , es posible hacerlo sin restablecer el puntero interno. Se podría utilizar array_key_first. Si está seguro de que su matriz tiene valores, puede hacer lo siguiente:

$first = $array[array_key_first($array)];

Lo más probable es que desee manejar el caso donde la matriz está vacía:

$first = (empty($array)) ? $default : $array[array_key_first($array)];
cjc
fuente
-3

solo puedes usar $array[0]. siempre te dará el primer artículo

Kareem Salem
fuente