Quelle est la meilleure façon de déterminer la première clé dans un tableau éventuellement associatif? La première fois que je pensais que c'était juste pour atteindre chaque tableau et ensuite 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. Est-ce que quelqu'un a une meilleure solution?
A partir de PHP 7.3 , il existe une nouvelle fonction intégrée appelée array_key_first()
qui récupère la première clé du tableau donné sans réinitialiser les paramètres internes. aiguille. Consultez le documentation pour plus d'informations.
Vous pouvez utiliser reset
et key
:
reset($array);
$first_key = key($array);
C'est essentiellement la même chose que votre code initial, mais avec un peu moins de frais généraux, et ce qui se passe est plus évident.
Rappelez-vous simplement d'appeler reset
, ou vous obtiendrez n'importe laquelle des clés du tableau. Vous pouvez également utiliser end
au lieu de reset
pour obtenir la dernière clé.
Si vous voulez que la clé obtienne la première valeur, reset
la renvoie en fait:
$first_value = reset($array);
Il y a cependant un cas à surveiller (donc vérifiez d'abord la longueur du tableau):
$arr1 = array(false);
$arr2 = array();
var_dump(reset($arr1) === reset($arr2)); // bool(true)
array_keys
renvoie un tableau de clés. Prenez la première entrée. Vous pouvez aussi appeler reset
sur le tableau, puis key
. Cette dernière approche est probablement légèrement plus rapide (mais je ne l’ai pas testée), mais elle a pour effet secondaire de réinitialiser le pointeur interne.
Chose intéressante, la boucle foreach est en fait le moyen le plus efficace de le faire.
Le PO ayant spécifiquement posé des questions sur l'efficacité, il convient de souligner que toutes les réponses actuelles sont en réalité bien moins efficaces qu'un foreach.
J'ai fait un point de repère à ce sujet avec php 5.4, et la méthode de réinitialisation/pointeur clé (réponse acceptée) semble être environ 7 fois plus lente qu'une foreach. D'autres approches manipulant le tableau entier (array_keys, array_flip) sont évidemment encore plus lentes que cela et empirent beaucoup lorsque vous travaillez avec un grand tableau.
Foreach n’est pas du tout inefficace, n’hésitez pas à l’utiliser!
Edit 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, je n'ai trouvé le foreach que deux fois plus vite que reset/key. J'ai utilisé un tableau de 100 clés et exécuté chaque méthode un million de fois pour obtenir une différence notable, voici le code de la référence 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 />";
Sur mon php 5.5 cette sortie:
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
reset + key http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs
key($an_array)
vous donnera la première clé
edit per Blixt: vous devez appeler reset($array);
avant key($an_array)
pour réinitialiser le pointeur au début du tableau.
Tu pourrais essayer
array_keys($data)[0]
pour 2018 +
À partir de PHP 7.3, il existe une fonction array_key_first()
qui remplit exactement cette fonction:
$array = ['foo' => 'lorem', 'bar' => 'ipsum'];
$firstKey = array_key_first($array); // 'foo'
La documentation est disponible ici . ????
list($firstKey) = array_keys($yourArray);
Si l'efficacité n'est pas très importante pour vous, vous pouvez utiliser array_keys($yourArray)[0]
dans PHP 5.4 (et versions ultérieures).
Exemples:
# 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"
L'avantage sur la solution:
list($firstKey) = array_keys($yourArray);
c’est que vous pouvez passer array_keys($arr)[0]
comme paramètre de fonction (c.-à-d. doSomething(array_keys($arr)[0], $otherParameter)
).
HTH
$myArray = array(
2 => '3th element',
4 => 'first element',
1 => 'second element',
3 => '4th element'
);
echo min(array_keys($myArray)); // return 1
Veuillez trouver ce qui suit:
$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$keys = array_keys($yourArray);
echo "Key = ".$keys[0];
Cela pourrait aussi être une solution.
$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$first_key = current(array_flip($yourArray));
echo $first_key;
Je l'ai testé et ça marche.
Pour améliorer la solution de Webmut , j'ai ajouté la solution suivante:
$firstKey = array_keys(array_slice($array, 0, 1, TRUE))[0];
Le résultat pour moi sur PHP 7.1 est:
foreach to get first key and value: 0.048566102981567 seconds
reset+key to get first key and value: 0.11727809906006 seconds
reset+key to get first key: 0.11707186698914 seconds
array_keys to get first key: 0.53917098045349 seconds
array_slice to get first key: 0.2494580745697 seconds
Si je fais cela pour un tableau de taille 10000, alors les résultats deviennent
foreach to get first key and value: 0.048488140106201 seconds
reset+key to get first key and value: 0.12659382820129 seconds
reset+key to get first key: 0.12248802185059 seconds
array_slice to get first key: 0.25442600250244 seconds
La méthode array_keys a expiré au bout de 30 secondes (avec seulement 1000 éléments, le temps restant était à peu près le même, mais la méthode array_keys comptait environ 7,5 secondes).
La meilleure façon qui a fonctionné pour moi était
array_shift(array_keys($array))
array_keys
obtient un tableau de clés à partir du tableau initial, puis array_shift
en coupe le premier élément. Vous aurez besoin de PHP 5.4+ pour cela.
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
list($first_key) = each($arr);
print $first_key;
// key1
C'est le moyen le plus simple que j'ai jamais trouvé. Rapide et seulement deux lignes de code :-D
$keys = array_keys($array);
echo $array[$keys[0]];
php73:
$array = ['a' => '..', 'b' => '..'];
array_key_first($array); // 'a'
array_key_last($array); // 'b';
Aujourd'hui, je devais 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
J'ai fait ça et ça marche.
$data = $request->request->all();
dump($data);
while ($test = current($data)) {
dump($test);
echo key($data).'<br />';die();
break;
}
Peut-être que ce sera éco 15min d'un autre gars. CYA.
Un one-liner:
$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );
# echos 'key1'