È interessante notare che il ciclo foreach è in realtà il modo più efficiente per farlo.
Dato che il PO ha specificamente chiesto l'efficienza, si dovrebbe sottolineare che tutte le risposte attuali sono in effetti molto meno efficienti di una ricerca.
Ho fatto un benchmark su questo con php 5.4 e il metodo di puntatore reset / tasto (risposta accettata) sembra essere circa 7 volte più lento di un foreach. Altri approcci che manipolano l'intero array (array_keys, array_flip) sono ovviamente anche più lenti di così e peggiorano molto quando si lavora con un array di grandi dimensioni.
Foreach non è affatto inefficiente, sentiti libero di usarlo!
Modifica 03-03-2015:
Sono stati richiesti script di benchmark, non ho quelli originali, ma ho fatto alcuni nuovi test. Questa volta ho trovato foreach solo circa due volte più veloce di reset / key. Ho usato un array di 100 tasti ed eseguito ogni metodo un milione di volte per ottenere una notevole differenza, ecco il codice del semplice benchmark:
$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 />";
Sul mio php 5.5 questo produce:
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 + chiave http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs