Интересно, что цикл foreach на самом деле является наиболее эффективным способом сделать это.
Поскольку ОП конкретно спрашивает об эффективности, следует отметить, что все текущие ответы на самом деле гораздо менее эффективны, чем foreach.
Я сделал тест на это с php 5.4, и метод указателя сброса / ключа (принятый ответ), кажется, примерно в 7 раз медленнее, чем foreach. Другие подходы, манипулирующие всем массивом (array_keys, array_flip), очевидно, даже медленнее этого и становятся намного хуже при работе с большим массивом.
Foreach не является неэффективным, не стесняйтесь использовать его!
Изменить 2015-03-03:
Запрошены эталонные скрипты, у меня нет оригинальных, но вместо этого я провел несколько новых тестов. На этот раз я нашел foreach только в два раза быстрее, чем кнопка сброса / нажатия. Я использовал массив из 100 ключей и запускал каждый метод по миллиону раз, чтобы получить заметную разницу, вот код простого теста:
$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 />";
На моем PHP 5.5 это выводит:
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
сброс + ключ http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs