Im Allgemeinen gibt es drei Methoden zum Durchlaufen eines Arrays: for, while und foreach. Die einfachste und bequemste davon ist foreach. Was sind also die Unterschiede in der Bedienung und Leistung? Welche Methode ist normalerweise besser zu verwenden?
Testen wir zunächst die Zeit, die zum Durchlaufen eines eindimensionalen Arrays mit 50.000 Indizes benötigt wird:
Testplattform:
CPU: PM 725
Speicher: 512 MB
Festplatte: 40G 5400 U/min
Betriebssystem: Windows XP SP2
WEB: Apache 2.0.54 PHP5.0.4
Testcode:
<?php
/*
* @ Autor: Lilov
* @ Homepage: www.codesky.com
* @ E-Mail: [email protected]
*
*/
$arr = array();
for($i = 0; $i < 50000; $i++){
$arr[] = $i*rand(1000,9999);
}
Funktion GetRunTime()
{
list($usec,$sec)=explode(" ",microtime());
return ((float)$usec+(float)$sec);
}
###################################
$time_start = GetRunTime();
for($i = 0; $i < count($arr); $i++){
$str .= $arr[$i];
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Verwendete Zeit von für:'.round($time_used, 7).'(s)<br><br>';
unset($str, $time_start, $time_end, $time_used);
###################################
$time_start = GetRunTime();
while(list($key, $val) = every($arr)){
$str .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Verwendete Zeit von while:'.round($time_used, 7).'(s)<br><br>';
unset($str, $key, $val, $time_start, $time_end, $time_used);
###################################
$time_start = GetRunTime();
foreach($arr as $key => $val){
$str .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Verwendete Zeit von foreach:'.round($time_used, 7).'(s)<br><br>';
#####################################
?>
Testergebnisse:
Durchschnitt der drei Testergebnisse:
Entspricht for, while bzw. foreach
0,1311650
0,1666853
0,1237440
Nach wiederholten Tests zeigen die Ergebnisse, dass beim Durchlaufen desselben Arrays foreach am schnellsten und while am langsamsten ist. foreach ist etwa 20 % bis 30 % schneller als while. Erhöhen Sie dann den Array-Index auf 500000 und 5000000, und die Testergebnisse sind dieselben. Aber aus prinzipieller Sicht arbeitet foreach an einer Kopie des Arrays (durch Kopieren des Arrays), während while durch Verschieben des internen Index des Arrays arbeitet. Im Allgemeinen wird angenommen, dass while schneller sein sollte als foreach (weil foreach platziert zuerst das Array, während while den internen Zeiger direkt bewegt, aber das Ergebnis ist genau das Gegenteil. Der Grund dürfte sein, dass foreach eine interne Implementierung von PHP ist, während while eine allgemeine Schleifenstruktur ist.
Daher bevorzuge ich in allgemeinen Anwendungen die Verwendung der foreach-Form, die einfach und effizient ist. Unter PHP5 kann foreach auch die Attribute einer Klasse durchlaufen.