Question Obtenir la première clé dans un tableau (éventuellement) associatif?


Quelle est la meilleure façon de déterminer la première clé dans un tableau éventuellement associatif? Mon premier pensé à juste foreach le tableau, puis immédiatement le casser, 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?


639
2018-06-22 18:13


origine


Réponses:


Vous pouvez utiliser reset et key:

reset($array);
$first_key = key($array);

C'est essentiellement le même que votre code initial, mais avec un peu moins de frais généraux, et c'est plus évident ce qui se passe.

N'oubliez pas d'appeler reset, ou vous pouvez obtenir l'une des clés dans le tableau. Vous pouvez aussi utiliser end au lieu de reset pour obtenir la dernière clé.

Si vous vouliez que la clé obtienne la première valeur, reset le renvoie effectivement:

$first_value = reset($array);

Il y a cependant un cas particulier à surveiller (donc vérifiez d'abord la longueur du tableau):

$arr1 = array(false);
$arr2 = array();
var_dump(reset($arr1) === reset($arr2)); // bool(true)

1135
2018-06-22 18:16



array_keys retourne un tableau de clés. Prenez la première entrée. Alternativement, vous pouvez appeler reset sur le tableau, et par la suite key. Cette dernière approche est probablement légèrement plus rapide (je ne l'ai pas testé), mais elle a pour effet secondaire de réinitialiser le pointeur interne.


66
2018-06-22 18:15



Fait intéressant, 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 réalité 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 tout le tableau (array_keys, array_flip) sont évidemment encore plus lentes et deviennent beaucoup pire lorsque vous travaillez avec un large éventail.

Foreach n'est pas inefficace du tout, n'hésitez pas à l'utiliser!

Modifier 2015-03-03:

Des scripts de benchmark 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 environ deux fois plus rapide que reset / key. J'ai utilisé un tableau de 100 touches et exécuté chaque méthode un million de fois pour obtenir une différence notable, voici le code du benchmark 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, cela produit:

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

réinitialiser + clé http://3v4l.org/b4DrN/perf#tabs
pour chaque http://3v4l.org/gRoGD/perf#tabs


47
2018-01-19 16:47



key($an_array) vous donnera la première clé

éditer par Blixt: vous devriez appeler reset($array); avant key($an_array) pour réinitialiser le pointeur au début du tableau.


33
2018-06-22 18:16



list($firstKey) = array_keys($yourArray);

21
2018-04-12 13:38



Si l'efficacité n'est pas si importante pour vous, vous pouvez utiliser array_keys($yourArray)[0] en PHP 5.4 (et plus).

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 tu peux passer array_keys($arr)[0] en tant que paramètre de fonction (c.-à-d. doSomething(array_keys($arr)[0], $otherParameter)).

HTH


19
2018-04-25 20:45



Tu pourrais essayer

array_keys($data)[0]

15
2017-11-06 11:42



$myArray = array(
    2 => '3th element',
    4 => 'first element',
    1 => 'second element',
    3 => '4th element'
);
echo min(array_keys($myArray)); // return 1

11
2018-04-28 07:02