Curiosamente, el bucle foreach es en realidad la forma más eficiente de hacerlo.
Dado que el OP preguntó específicamente sobre la eficiencia, debe señalarse que todas las respuestas actuales son, de hecho, mucho menos eficientes que un foreach.
Hice un punto de referencia sobre esto con php 5.4, y el método de reinicio / puntero de tecla (respuesta aceptada) parece ser aproximadamente 7 veces más lento que un foreach. Otros enfoques que manipulan toda la matriz (array_keys, array_flip) son obviamente aún más lentos que eso y empeoran mucho cuando se trabaja con una matriz grande.
Foreach no es ineficiente en absoluto, ¡no dudes en usarlo!
Editar 2015-03-03:
Se han solicitado scripts de referencia, no tengo los originales, sino que hice algunas pruebas nuevas. Esta vez encontré el foreach solo el doble de rápido que reset / key. Utilicé una matriz de 100 teclas y ejecuté cada método un millón de veces para obtener una diferencia notable, aquí está el código del punto de referencia 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 />";
En mi php 5.5 esto produce:
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