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.
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.
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();
array_shift(array_keys($array))
each()
est encore temporaire, mais peut être beaucoup plus léger que l’utilisation de array_keys()
.
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)