web-dev-qa-db-fra.com

Retourne la première clé du tableau associatif dans PHP

J'essaie d'obtenir la première clé d'un tableau associatif, sans créer de variable temporaire via array_keys() ou similaire, à transmettre par référence. Malheureusement, reset() et array_shift() prennent l'argument de tableau par référence, donc aucun des deux ne semble être un résultat viable.

Avec PHP 5.4 je serai au paradis; array_keys($array)[0];, mais malheureusement ce n'est évidemment pas une option non plus.

Je pourrais créer une fonction à cette fin, mais je ne peux qu’imaginer qu’il existe un mélange des fonctions array_* de PHP qui produira le résultat souhaité dans une seule déclaration, que je ne peux ni penser ni écrire.

Alors:

$array = array('foo' => 'bar', 'hello' => 'world');

$firstKey = assorted_functions($array); // $firstKey = 'foo'

La raison de la clause "pas de référence" dans ma question est uniquement due au fait que je suppose que array_keys() sera requis (s'il existe un moyen de passer par référence, veuillez vous en priver})

J'utiliserais key(), mais cela nécessite un reset() car je ne sais pas trop où sera le pointeur au moment de cette opération.


Addenda

Je fais suite à une réalisation que j’ai eue récemment: comme je l’ai mentionné dans les commentaires, la mémoire sera utilisée de la même manière, donc si cela pose un problème, cette question n’a pas de solution.

$a = range(0,99999);
var_dump(memory_get_peak_usage()); // int(8644416)
$k = array_keys($a)[0];
var_dump(memory_get_peak_usage()); // int(17168824)

Je connaissais ceci, car PHP ne dispose pas de telles capacités d'optimisation, mais a estimé qu'il méritait une mention explicite.

La brièveté de la réponse acceptée est cependant agréable et fonctionnera si vous travaillez avec des tableaux de taille {raisonnable.

36
Dan Lugg

Bien que array_shift(array_keys($array)); fonctionne, current(array_keys($array)); est plus rapide car il ne fait pas avancer le pointeur interne.

Soit on travaillera bien.

Mettre à jour

Comme @TomcatExodus l'a noté, array_shift(); attend un tableau passé par référence. Le premier exemple génère donc une erreur. Il vaut mieux rester avec current();

63
adlawson

Vous pouvez utiliser reset et key :

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

ou, vous pouvez utiliser une fonction:

function firstIndex($a) { foreach ($a as $k => $v) return $k; }
$key = firstIndex( $array );
18
Brian Graham
array_shift(array_keys($array))
1
RiaD

each() est encore temporaire, mais peut être beaucoup plus léger que l’utilisation de array_keys().

1
Orbling

Pourquoi ne pas utiliser array_slice (en combinaison avec array_keys pour les tableaux associatifs)?

$a = range(0,999999);
var_dump(memory_get_peak_usage());
$k = array_keys(array_slice($a, 0, 1, TRUE))[0];
var_dump(memory_get_peak_usage());
var_dump($k);
$k = array_keys($a)[0];
var_dump(memory_get_peak_usage());

Donne en sortie (au moins avec moi):

int(36354360)
int(36355112)
int(0)
int(72006024)
int(0)
0
PrinsEdje80