Chose intéressante, 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 fait 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 l'ensemble du tableau (array_keys, array_flip) sont évidemment encore plus lentes que cela et deviennent bien pires lorsque vous travaillez avec un grand tableau.
Foreach n'est pas du tout inefficace, n'hésitez pas à l'utiliser!
Modifier 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, j'ai trouvé le foreach seulement deux fois plus rapide que reset / key. J'ai utilisé un tableau de 100 clés et j'ai 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
reset + key http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs