J'ai un tableau:
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
Je voudrais obtenir le premier élément de ce tableau. Résultat attendu: chaîne apple
Une exigence: cela ne peut pas être fait en passant par référence , ce array_shift
n'est donc pas une bonne solution.
Comment puis-je faire ceci?
&$array
comme paramètres.Réponses:
Réponse originale, mais coûteuse (O (n)):
Dans O (1):
Autres cas d'utilisation, etc ...
Si la modification (dans le sens de la réinitialisation des pointeurs de tableau) de
$array
n'est pas un problème, vous pouvez utiliser:Cela devrait être théoriquement plus efficace, si une "copie" de tableau est nécessaire:
Avec PHP 5.4+ (mais peut provoquer une erreur d'index s'il est vide):
la source
list()
etreset()
sont des solutions beaucoup plus agréables à mon avis.Comme Mike l'a souligné (de la manière la plus simple possible):
Si vous souhaitez obtenir la clé: (exécutez-la après la réinitialisation)
De la documentation de PHP :
La description:
la source
foreach
avec le tableau sujet, vous le foirerez.foreach
copiera le tableau dans lequel il boucle.key($arr)
et vous obtiendrez «4» (ajouté à la réponse)reset()
. 2) Non, foreach NE crée PAS de copie d'un tableau !!! Il crée uniquement son propre pointeur (pas même une copie d'un pointeur existant - il est également facile à vérifier, en appelantnext()
avant foreach).la source
Si vous ne voulez pas perdre la position actuelle du pointeur, créez simplement un alias pour le tableau.
la source
reset()
renvoie déjà le premier élément, donc il n'est pas nécessaire d'utilisercurrent()
-echo reset($arr)
devrait suffirecurrent
àreset
éviter un avis PHP / erreur produite dans les cas de référence, par exemplecurrent(array_filter(...));
dans 3v4l .current($array)
peut vous obtenir le premier élément d'un tableau, selon le manuel PHP .Cela fonctionne donc jusqu'à ce que vous ayez repositionné le pointeur du tableau, sinon vous devrez réinitialiser le tableau.
la source
current($array)
ne fonctionnera que si le pointeur du tableau pointe "actuellement" sur le premier élément, sinon ilreset($array)
serait nécessaire.current()
ne semble plus avoir besoin d'une référence, bien que les documents PHP ne le reflètent pas. Je pense donc que c'est devenu la meilleure solution.Vous pouvez obtenir le Nème élément avec une construction de langage, "list":
Avec la
array_keys
fonction, vous pouvez faire de même pour les touches:la source
list($first_value) = $my_array;
mon avis, la meilleure option. Il n'a pas les problèmes des autres réponses présentées ici: pas de "surpuissance" car il ne copie ni le tableau ni n'en crée un nouveau. Pas de "références": le tableau n'est pas modifié. Pas de "reset": pas de modification du pointeur interne du tableau ...int
, essayez de le fairelist($firstItem) = array('key1' => 'value1');
et vous obtiendrez une erreurNotice: Undefined offset: 0
list($x) = foo();
est équivalent à$x = foo()[0];
. Notez que ce n'est pas nécessairement la même chose que "obtenir le premier élément", car même un tableau indexé sur un entier peut ne pas avoir d'élément avec la clé 0. Dans mon cas, je faisais "list ($ order) = get_order ($ user) " mais "get_order" renvoyait des commandes saisies par leur ID, qui n'était généralement pas 0. Comme le dit @Sergiy, array_values () corrige cela, mais nuit à l'efficacité et (surtout) à la lisibilité du code.PHP 5.4+:
la source
$array_values = array_values($array); $value = $array_values[0];
PHP 7.3 a ajouté deux fonctions pour obtenir directement la première et la dernière clé d'un tableau sans modifier le tableau d'origine et sans créer d'objets temporaires:
En plus d'être significatives sur le plan sémantique, ces fonctions ne déplacent même pas le pointeur du tableau (comme le
foreach
ferait).Ayant les clés, on peut obtenir les valeurs directement par les clés.
Exemples (tous nécessitent PHP 7.3+)
Obtention de la première / dernière clé et valeur:
Obtention de la première / dernière valeur en une ligne, en supposant que le tableau ne peut pas être vide :
Obtention de la première / dernière valeur sous une seule ligne, avec des valeurs par défaut pour les tableaux vides:
la source
$first_value = $my_array[array_key_first($my_array)] ?? null;
Supposer:
Utilisez simplement:
pour obtenir le premier élément ou
pour obtenir la première clé.
Ou vous pouvez dissocier le premier si vous souhaitez le supprimer.
la source
current
alors?Certains tableaux ne fonctionnent pas avec des fonctions telles que
list
,reset
oucurrent
. Ce sont peut-être des tableaux "faux" - implémentant partiellement ArrayIterator, par exemple.Si vous souhaitez extraire la première valeur quel que soit le tableau, vous pouvez court-circuiter un itérateur:
Votre valeur sera alors disponible en
$value
et la boucle se cassera après la première itération. C'est plus efficace que de copier un tableau potentiellement volumineux dans une fonction comme array_unshift (array_values ($ arr)).Vous pouvez également saisir la clé de cette façon:
Si vous appelez cela à partir d'une fonction, revenez simplement tôt:
la source
Des assistants de Laravel :
Le tableau étant transmis par valeur à la fonction, la réinitialisation () affecte le pointeur interne d'une copie du tableau et ne touche pas le tableau d'origine (notez qu'il renvoie
false
si le tableau est vide).Exemple d'utilisation:
Voici également une alternative. C'est très légèrement plus rapide, mais plus intéressant. Il permet de changer facilement la valeur par défaut si le tableau est vide:
Pour mémoire, voici une autre réponse à moi , pour le dernier élément du tableau.
la source
Gardez cela simple! Il y a beaucoup de bonnes réponses ici, mais pour minimiser toute la confusion, ces deux fonctionnent et réduisent beaucoup les frais généraux:
key($array)
obtient la première clé d'un tableaucurrent($array)
obtient la première valeur d'un tableauEDIT:
Concernant les commentaires ci-dessous. L'exemple suivant sortira:
string(13) "PHP code test"
la source
current
est égal à l'élément actuel. Vous devez réinitialiser le pointeur au début du tableau pour vous assurer qu'il se trouve bien au début.Faites simplement:
la source
Je le ferais
echo current($array)
.la source
current()
ne commet pas d'erreur lorsque des non-références sont transmises. À condition que le pointeur soit toujours au début, cela fonctionne.reset
l'avis "Seules les variables doivent être transmises par référence" alors que cecurrent
n'est pas le cas: exemple de l'éditeur PHP en ligne decurrent(array_filter(...));
.next()
,end()
ou de toute autre fonction qui modifie le pointeur interne du tableau. Dans mon exemple,current()
retourne null car le pointeur interne est "hors de portée" du tableau. Mais il peut aussi pointer «virtuellement» vers n'importe quel élément / aléatoire.Production:
la source
la source
C'est beaucoup plus efficace que
array_values()
parce que laeach()
fonction ne copie pas la totalité du tableau.Pour plus d'informations, voir http://www.php.net/manual/en/function.each.php
la source
because the each() function does not copy the entire array.
+1Une façon délicate est:
la source
reset()
que le pointeur de tableau est réinitialisé avant d'foreach
être appelé de toute façon.Obtenez le premier élément:
Obtenir le dernier élément
la source
La plupart de ces travaux! MAIS pour un appel rapide sur une seule ligne (faible ressource):
Bien que cela fonctionne, et décemment bien, veuillez également consulter ma réponse supplémentaire: https://stackoverflow.com/a/48410351/1804013
la source
current($array)
, ce qui nécessite que le pointeur interne du tableau soit au premier élément de toute façon, auquel cas,echo reset($array)
est le plus approprié.Je pense que l'utilisation de array_values serait votre meilleur pari ici. Vous pouvez retourner la valeur à l'index zéro à partir du résultat de cette fonction pour obtenir «pomme».
la source
C'est un peu tard dans le jeu, mais on m'a présenté un problème où mon tableau contenait des éléments de tableau en tant qu'enfants à l'intérieur, et donc je ne pouvais pas simplement obtenir une représentation sous forme de chaîne du premier élément de tableau. En utilisant la
current()
fonction de PHP , j'ai réussi ceci:Merci à toutes les solutions actuelles qui m'ont aidé à obtenir cette réponse, j'espère que cela aidera quelqu'un un jour!
la source
Utilisation:
Par défaut,
array_slice
ne conserve pas les clés, nous pouvons donc utiliser zéro en toute sécurité comme index.la source
Deux solutions pour vous.
Solution 1 - Utilisez simplement la clé. Vous n'avez pas dit que vous ne pouviez pas l'utiliser. :)
Solution 2 - array_flip () + key ()
Solution 3 - array_keys ()
la source
Ce n'est pas une réponse aussi simple dans le monde réel. Supposons que nous ayons ces exemples de réponses possibles que vous pouvez trouver dans certaines bibliothèques.
Comme vous pouvez le voir, nous avons plusieurs solutions «une ligne» qui fonctionnent bien dans certains cas, mais pas dans tous.
À mon avis, vous devez utiliser ce gestionnaire uniquement avec des tableaux.
Parlons maintenant des performances, en supposant que nous avons toujours un tableau, comme ceci:
array_shift
est plus rapide quereset
, c'est plus rapide que [count () - 1], et ces trois sont plus rapides quearray_values
etarray_slice
.la source
J'imagine que l'auteur cherchait simplement un moyen d'obtenir le premier élément d'un tableau après l'avoir obtenu à partir d'une fonction ( mysql_fetch_row , par exemple) sans générer de STRICT "Seules les variables doivent être passées par référence".
Si c'est le cas, presque toutes les façons décrites ici obtiendront ce message ... et certaines d'entre elles utilisent beaucoup de mémoire supplémentaire pour dupliquer un tableau (ou une partie de celui-ci). Un moyen simple de l'éviter consiste simplement à affecter la valeur en ligne avant d'appeler l'une de ces fonctions:
De cette façon, vous n'obtenez pas le message STRICT à l'écran, ni dans les journaux, et vous ne créez pas de tableaux supplémentaires. Il fonctionne avec les deux tableaux indexés ET associatifs .
la source
J'aime l'exemple "list", mais "list" ne fonctionne que sur le côté gauche d'une affectation. Si nous ne voulons pas affecter une variable, nous serions obligés de créer un nom temporaire, qui au mieux pollue notre portée et au pire écrase une valeur existante:
Ce qui précède remplacera toute valeur existante de $ x, et la variable $ x restera aussi longtemps que cette portée sera active (à la fin de cette fonction / méthode, ou pour toujours si nous sommes au niveau supérieur). Cela peut être contourné en utilisant call_user_func et une fonction anonyme, mais c'est maladroit:
Si nous utilisons des fonctions anonymes comme celle-ci, nous pouvons réellement nous en sortir avec reset et array_shift, même s'ils utilisent pass-by-reference. En effet, l'appel d'une fonction liera ses arguments, et ces arguments peuvent être passés par référence:
Cependant, cela est en fait exagéré, car call_user_func effectuera cette affectation temporaire en interne. Cela nous permet de traiter les fonctions passe-par-référence comme si elles étaient passe-par-valeur, sans aucun avertissement ni erreur:
la source
Un petit changement par rapport à ce que Sarfraz a publié est:
la source
Je n'aime pas jouer avec le pointeur interne du tableau, mais il est également inefficace de construire un deuxième tableau avec
array_keys()
ouarray_values()
, donc je définis généralement ceci:la source
Essaye ça:
la source