Comment récupérer le premier élément d'un tableau PHP associatif?

146

Si j'avais un tableau comme:

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

Et je voulais sortir le premier élément de ce tableau sans en connaître la clé, comment ferais-je cela? Y a-t-il une fonction pour cela?

Cliquez sur Upvote
la source
(référence) Arrays and Array Functions
Gordon

Réponses:

288

reset() vous donne la première valeur du tableau si vous avez un élément à l'intérieur du tableau:

$value = reset($array);

Il vous donne également FALSEsi le tableau est vide.

soulmerge
la source
A noter:$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
cwallenpoole
Plus d'informations sur la fonction de réinitialisation: www.w3schools.com/php/func_array_reset.asp
Paul Chris Jones
Et si je veux obtenir la clé et la valeur?
Timberman
51

PHP <7,3

Si vous n'en savez pas assez sur le tableau (vous ne savez pas si la première clé est foo ou bar ), alors le tableau pourrait aussi être, peut-être, vide .

Il serait donc préférable de vérifier, surtout s'il y a une chance que la valeur retournée soit le booléen FALSE:

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

Le code ci-dessus utilise resetet a donc des effets secondaires (il réinitialise le pointeur interne du tableau), vous pouvez donc préférer utiliser array_slicepour accéder rapidement à une copie du premier élément du tableau:

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

En supposant que vous souhaitiez obtenir à la fois la clé et la valeur séparément , vous devez ajouter le quatrième paramètre à array_slice:

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

Pour obtenir le premier élément par paire ( key => value):

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

Modification simple pour obtenir le dernier élément, la clé et la valeur séparément:

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

performance

Si le tableau n'est pas vraiment grand, vous n'avez pas réellement besoin array_sliceet pouvez plutôt obtenir une copie de l'ensemble du tableau de clés, puis obtenez le premier élément:

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

Si vous avez un très grand tableau, cependant, l'appel à array_keysnécessitera beaucoup plus de temps et de mémoire array_slice(les deux fonctions parcourent le tableau, mais ce dernier se termine dès qu'il a rassemblé le nombre requis d'éléments - qui est un).

Une exception notable est lorsque vous avez la première clé qui pointe vers un objet très volumineux et alambiqué. Dans ce cas array_slice, vous dupliquerez ce premier gros objet, tandis que vous array_keysne saisiriez que les clés.

PHP 7.3

PHP 7.3 implémente array_key_first()ainsi que array_key_last(). Celles-ci sont explicitement fournies pour accéder efficacement aux première et dernière clés sans réinitialiser l'état interne du tableau comme effet secondaire.

Ainsi, en PHP 7.3, la première valeur de $arraypeut être accédée avec

$array[array_key_first($array)];

Vous feriez quand même mieux de vérifier que le tableau n'est pas vide, sinon vous obtiendrez une erreur:

$firstKey = array_key_first($array);
if (null === $firstKey) {
    $value = "Array is empty"; // An error should be handled here
} else {
    $value = $array[$firstKey];
}
LSerni
la source
@AhmedShefeer eh bien, l'autre réponse n'est pas seulement celle acceptée, mais elle est là depuis huit ans de plus . Je ramasse en quelque sorte les miettes ici :-D. Mais merci pour le vote de confiance!
LSerni
1
Il me semble que c'est la meilleure réponse, car la seule autre non obsolète qui donne à la fois la clé et la valeur est la boucle foreach abandonnée, ce qui est gênant. Les autres réponses ne donnent que la valeur sans la clé.
sootsnoot
1
J'ai adoré cette approche moderne et mise à jour avec le temps.
sanjeet bisht
@LSerni Je ne sais pas si vous êtes toujours actif, mais j'étais coincé et ce message bien expliqué et mis à jour m'a sauvé. Merci
izk
@izk je suis toujours actif! :-D
LSerni
44

Fausse boucle qui se brise lors de la première itération:

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

echo "$key = $value\n";

Ou utilisez each()( avertissement: obsolète depuis PHP 7.2.0 ):

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

echo "$key = $value\n";
John Kugelman
la source
2
Probablement parce que reset () est plus simple.
mjs
1
Parce que la solution se trouve dans votre première ligne de code, mais que vous continuez à écrire une autre ligne totalement inutile.
markus
21
réinitialiser ne rendra pas la clé
HarryFink
3
+1 pour la «fausse boucle». J'ai eu besoin de récupérer la clé et la valeur des premiers éléments, sans passer par chaque élément. La reset()fonction ne récupérerait que la première valeur.
Phil Cross
2
+1 pour la fausse boucle également, je dois garder la clé, donc la réinitialisation n'était pas une option
isJustMe
25

Il y a quelques options. array_shift()renverra le premier élément, mais supprimera également le premier élément du tableau.

$first = array_shift($array);

current() retournera la valeur du tableau sur lequel pointe son pointeur de mémoire interne, qui est le premier élément par défaut.

$first = current($array);

Si vous voulez vous assurer qu'il pointe vers le premier élément, vous pouvez toujours utiliser reset().

reset($array);
$first = current($array);
Jeremy Ruten
la source
3
J'aime cette réponse comme la plus complète, mais la note reset()renvoie réellement l'élément, donc suivre cela avec un $first = current($array)est redondant.
Tom Auger
9

Juste pour que nous ayons d'autres options: reset($arr);assez bien si vous n'essayez pas de garder le pointeur de tableau en place, et avec de très grands tableaux, cela entraîne une charge minimale. Cela dit, il y a quelques problèmes avec cela:

$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 façon de faire cela sans changer le pointeur:

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

L'avantage de $arr[reset(array_keys($arr))];est qu'il déclenche un avertissement si le tableau est réellement vide.

cwallenpoole
la source
réponse très descriptive, et cela signifie beaucoup pour les autres. Merci mec.
Jigar7521
7

un autre moyen facile et simple de le faire utilise array_values

array_values($array)[0]
Débutant
la source
reset()est une bien meilleure option car elle renvoie false si le tableau est vide. votre solution ne fonctionnera pas par exemple dans la question
Northys
1
En PHP 7+, quelque chose comme ça fonctionnerait:array_values($array)[0] ?? FALSE
MarthyM
4

Testez si la variable a est un tableau avant d'obtenir le premier élément. Lors de la création dynamique du tableau s'il est défini sur null, vous obtenez une erreur.

Par exemple:

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

Nous pouvons faire $first = reset($array);

Au lieu de

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

Comme reset()

renvoie le premier élément du tableau après la réinitialisation;

Suryasish Dey
la source
2

Tu peux faire:

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

Utilisez la fonction reset () pour extraire le premier élément de ce tableau sans en connaître la clé comme ceci.

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

sortie // 400

Wakar Ahmad Khan
la source
2

Vous pouvez essayer ceci.

Pour obtenir la première valeur du tableau: -

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

Pour obtenir la première clé du tableau

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

Vous pouvez utiliser array_shift

César
la source
4
Mais sachez que le tableau aura un élément supprimé.
challet du
1

Je fais cela pour obtenir la première et la dernière valeur. Cela fonctionne également avec plus de valeurs.

$a = array(
    'foo' => 400,
    'bar' => 'xyz',
);
$first = current($a);   //400
$last = end($a);    //xyz
Daantje
la source
Cela ne fonctionne que lorsque le pointeur interne est sur le premier élément. Bien que ce soit bon car cela ne réinitialise pas la position du pointeur, cela ne fonctionne que lorsque le pointeur est déjà au repos.
cjc
1

À partir de PHP 7.3.0, il est possible de se passer de réinitialiser le pointeur interne. Vous utiliseriez array_key_first. Si vous êtes sûr que votre tableau contient des valeurs, vous pouvez simplement faire:

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

Plus probablement, vous voudrez gérer le cas où le tableau est vide:

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

vous pouvez simplement utiliser $array[0]. il vous donnera toujours le premier article

Kareem Salem
la source