Cukup menarik, loop foreach sebenarnya adalah cara paling efisien untuk melakukan ini.
Karena OP secara khusus bertanya tentang efisiensi, harus ditunjukkan bahwa semua jawaban saat ini sebenarnya jauh lebih efisien daripada pendahuluan.
Saya melakukan benchmark dengan php 5.4, dan metode reset / pointer kunci (jawaban yang diterima) tampaknya sekitar 7 kali lebih lambat daripada foreach. Pendekatan lain yang memanipulasi seluruh array (array_keys, array_flip) jelas bahkan lebih lambat dari itu dan menjadi lebih banyak lebih buruk ketika bekerja dengan array besar.
Foreach sama sekali tidak efisien, jangan ragu untuk menggunakannya!
Edit 2015-03-03:
Skrip benchmark telah diminta, saya tidak punya yang asli tetapi membuat beberapa tes baru sebagai gantinya. Kali ini saya menemukan foreach hanya sekitar dua kali lebih cepat dari reset / kunci. Saya menggunakan array 100-kunci dan menjalankan setiap metode sejuta kali untuk mendapatkan beberapa perbedaan nyata, inilah kode tolok ukur sederhana:
$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 />";
Pada php saya 5.5 output ini:
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