Co ciekawe, pętla foreach jest w rzeczywistości najbardziej efektywnym sposobem na zrobienie tego.
Ponieważ PO konkretnie zapytał o efektywność, należy zauważyć, że wszystkie obecne odpowiedzi są w rzeczywistości znacznie mniej skuteczne niż foreach.
Zrobiłem test porównawczy na php 5.4, a metoda reset / wskaźnik klucza (zaakceptowana odpowiedź) wydaje się być około 7 razy wolniejsza niż foreach. Inne podejścia do manipulowania całą tablicą (array_keys, array_flip) są oczywiście jeszcze wolniejsze i stają się znacznie gorsze podczas pracy z dużą tablicą.
Foreach wcale nie jest nieefektywny, możesz go używać!
Edytuj 2015-03-03:
Zażądano skryptów testowych, nie mam oryginalnych, ale wykonałem kilka nowych testów. Tym razem znalazłem foreach tylko około dwa razy szybciej niż reset / klucz. Użyłem tablicy 100-klawiszowej i każdą metodę milion razy uruchomiłem, aby uzyskać zauważalną różnicę, oto kod prostego testu porównawczego:
$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 />";
Na moim php 5.5 ten wynik:
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 + klucz http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs