Curiosamente, o loop foreach é realmente a maneira mais eficiente de fazer isso.
Como o PO perguntou especificamente sobre eficiência, deve-se ressaltar que todas as respostas atuais são de fato muito menos eficientes do que uma pesquisa.
Fiz uma referência nisso com o php 5.4, e o método de reset / key pointer (resposta aceita) parece ser cerca de 7 vezes mais lento que um foreach. Outras abordagens manipulando toda a matriz (array_keys, array_flip) são obviamente ainda mais lentas que isso e se tornam muito piores ao trabalhar com uma matriz grande.
O Foreach não é ineficiente, fique à vontade para usá-lo!
Editar 03-03-2015:
Scripts de benchmark foram solicitados, eu não tenho os originais, mas fiz alguns novos testes. Dessa vez, encontrei o foreach apenas duas vezes mais rápido que a tecla reset /. Usei uma matriz de 100 chaves e executei cada método um milhão de vezes para obter alguma diferença perceptível, aqui está o código da referência simples:
$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 />";
No meu php 5.5 esta saída:
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
tecla reset + http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs