web-dev-qa-db-fra.com

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? 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?

723
Alex S

Mise à jour 2019

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)
1276
Blixt

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.

75
troelskn

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

52
Webmut

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.

36
jimyi

Tu pourrais essayer

array_keys($data)[0]
22
Stopper

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 . ????

21
ivanaugustobd
list($firstKey) = array_keys($yourArray);
21
Sergiy Sokolenko

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

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

Veuillez trouver ce qui suit:

$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$keys   =   array_keys($yourArray);
echo "Key = ".$keys[0];

Exemple de travail:

12
Pupil

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.

Code de travail:

9
Pupil

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).

5
PrinsEdje80

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.

3
Yuriy Petrovskiy
 $arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
 list($first_key) = each($arr);
 print $first_key;
 // key1
3
voodoo417

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]];
3
Salvi Pascual

php73:

$array = ['a' => '..', 'b' => '..'];

array_key_first($array); // 'a'
array_key_last($array); // 'b';

http://php.net/manual/en/function.array-key-first.php

2

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

http://php.net/key

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.

0
Roupioz Clement

Un one-liner:

$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );

# echos 'key1'
0
Kohjah Breese