Интересно, что цикл 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