Quelle est la meilleure façon de déterminer la première clé d'un tableau éventuellement associatif? Mon premier a pensé à juste foreach le tableau, puis le casser immédiatement, comme ceci:
foreach ($an_array as $key => $val) break;
Ainsi, avoir $ key contient la première clé, mais cela semble inefficace. Quelqu'un at-il une meilleure solution?
foreach
est sémantiquement faux.each($arr)['key']
oueach($arr)[0]
fonctionnerait.0.0107
0.0217
Réponses:
Mise à jour 2019
À partir de PHP 7.3 , il existe une nouvelle fonction intégrée appelée
array_key_first()
qui récupérera la première clé du tableau donné sans réinitialiser le pointeur interne. Consultez la documentation pour plus d'informations.Vous pouvez utiliser
reset
etkey
:C'est essentiellement le même que votre code initial, mais avec un peu moins de surcharge, et c'est plus évident ce qui se passe.
N'oubliez pas d'appeler
reset
, sinon vous obtiendrez l'une des clés du tableau. Vous pouvez également utiliserend
au lieu dereset
pour obtenir la dernière clé.Si vous vouliez que la clé obtienne la première valeur, la
reset
renvoie en fait:Il y a cependant un cas particulier à surveiller (vérifiez d'abord la longueur du tableau):
la source
reset()
il arrive également de retourner le premier élément (valeur, pas clé) de n'importe quel tableau, ce qui peut également être utile.reset()
direDon't use
reset () `pour obtenir la première valeur d'un tableau associatif. Cela fonctionne très bien pour les vrais tableaux mais fonctionne de manière inattendue sur les objets Iterator. bugs.php.net/bug.php?id=38478 `Est-ce toujours vrai? Je suis confusarray
objets, mais d'objets personnalisés (qui ne sont pas de véritables tableaux). Je suppose qu'ils ont confondu la différence dans les structures de données, mais en gros,reset
renvoie la valeur de la première "clé", qui pour les objets serait$prop
dans l'exemple donné dans le rapport "bug", mais pour un tableau la première clé. Alors ne vous inquiétez pas, tant que vous utilisez de vrais tableaux (créés avecarray(…)
), vous n'aurez pas de problème.next
,reset
,end
ou en boucle à travers le réseau), vous ne recevrez pas la valeur attendue lorsque vous appelezkey
. Alors oui, appelez toujoursreset
avant d'utiliserkey
pour être sûr d'obtenir ce que vous voulez.array_keys
renvoie un tableau de clés. Prenez la première entrée. Alternativement, vous pouvez appelerreset
le tableau, puis par la suitekey
. Cette dernière approche est probablement légèrement plus rapide (même si je ne l'ai pas testée), mais elle a pour effet secondaire de réinitialiser le pointeur interne.la source
foreach
+break
etreset
+ enkey
fait. Mais le premier a l'air plutôt bizarre, donc pour les problèmes stylistiques, je préférerais le second.foreach
ne pas créer une copie interne pour cela, mais simplement itérer un pointeur , similaire à l'utilisation du niveau le plus basnext
,current
etc.Chose intéressante, la boucle foreach est en fait le moyen le plus efficace de le faire.
Étant donné que le PO a spécifiquement posé des questions sur l'efficacité, il convient de souligner que toutes les réponses actuelles sont en fait beaucoup moins efficaces qu'un foreach.
J'ai fait un benchmark avec php 5.4, et la méthode reset / key pointer (réponse acceptée) semble être environ 7 fois plus lente qu'une foreach. D'autres approches manipulant l'ensemble du tableau (array_keys, array_flip) sont évidemment encore plus lentes que cela et deviennent bien pires lorsque vous travaillez avec un grand tableau.
Foreach n'est pas du tout inefficace, n'hésitez pas à l'utiliser!
Modifier 2015-03-03:
Des scripts de référence ont été demandés, je n'ai pas les originaux mais j'ai fait de nouveaux tests à la place. Cette fois, j'ai trouvé le foreach seulement deux fois plus rapide que reset / key. J'ai utilisé un tableau de 100 clés et j'ai exécuté chaque méthode un million de fois pour obtenir une différence notable, voici le code du benchmark simple:
Sur mon php 5.5, cela produit:
reset + key http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs
la source
foreach
ne copie jamais le tableau sauf si vous le modifiez directement à l'intérieur de la boucle foreach. Sur php5, la structure du tableau peut être copiée dans certains cas (lorsque son refcount> 1) et vous avez en fait raison, cela pourrait avoir une influence significative. Heureusement, il n'y a rien à craindre sur php7, où ce problème a été résolu. Voici une excellente lecture à la fois sur la façon dont foreach fonctionne sous le capot maintenant et comment cela a fonctionné dans le passé.key($an_array)
vous donnera la première cléedit per Blixt: vous devez appeler
reset($array);
avantkey($an_array)
pour réinitialiser le pointeur au début du tableau.la source
Tu pourrais essayer
la source
Pour 2018+
À partir de PHP 7.3, il existe une
array_key_first()
fonction qui réalise exactement ceci:La documentation est disponible ici . 😉
la source
la source
Si l'efficacité n'est pas si importante pour vous, vous pouvez l'utiliser
array_keys($yourArray)[0]
en PHP 5.4 (et supérieur).Exemples:
L'avantage sur la solution:
c'est que vous pouvez passer
array_keys($arr)[0]
comme paramètre de fonction (iedoSomething(array_keys($arr)[0], $otherParameter)
).HTH
la source
array_keys($arr)[0]
syntaxe est-elle valide?array dereferencing
. Voir par exemple: schlueters.de/blog/archives/…Veuillez trouver les éléments suivants:
Exemple de travail:
la source
la source
max()
dose ne renvoie pas la première clé d'un tableau d'assoc. max return valeur maximale d'une liste ou d'un tableau élémentsCela pourrait également être une solution:
Je l'ai testé et ça marche.
Code de travail .
la source
Pour améliorer la solution de Webmut , j'ai ajouté la solution suivante:
La sortie pour moi sur PHP 7.1 est:
Si je fais cela pour un tableau de taille 10000, les résultats deviennent
La méthode array_keys expire à 30 secondes (avec seulement 1000 éléments, le timing pour le reste était à peu près le même, mais la méthode array_keys avait environ 7,5 secondes).
la source
la source
La meilleure façon qui a fonctionné pour moi était
array_keys
obtient le tableau de clés du tableau initial puis enarray_shift
coupe la première valeur d'élément. Vous aurez besoin de PHP 5.4+ pour cela.la source
C'est le moyen le plus simple que j'aie jamais trouvé. Rapide et seulement deux lignes de code :-D
la source
php73:
http://php.net/manual/en/function.array-key-first.php
la source
Un one-liner:
la source
Aujourd'hui, j'ai dû rechercher la première clé de mon tableau renvoyée par une requête POST. (Et notez le numéro d'un identifiant de formulaire, etc.)
Eh bien, j'ai trouvé ceci: Retourne la première clé du tableau associatif en PHP
http://php.net/key
J'ai fait ça, et ça marche.
Peut-être que ça va éco 15min d'un autre gars. CYA.
la source
Vous pouvez jouer avec votre tableau
Pour obtenir le premier élément du tableau, vous pouvez utiliser
current
et pour le dernier élément, vous pouvez utiliserend
Éditer
Juste pour ne plus obtenir de votes négatifs pour la réponse, vous pouvez convertir votre clé en valeur en utilisant
array_keys
et utiliser comme indiqué ci-dessus.la source