count() in for-Schleifen
Als Appetizer etwas Code. ;-)
$a = array('foo', 'bar', 'lala');
for ($i = 0; $i < count($a); $i ) {
// ...
}
Es kommt selten vor, dass ich sowas überhaupt brauche, da in diesen Fällen foreach() viel einfacher ist. Dennoch kann es vorkommen, dass eben diese Notation erwünscht ist.
Durch einen Kommentar auf StackOverflow bin ich auf folgenden Ansatz gestossen.
$a = array('foo', 'bar', 'lala');
for ($i = 0, $c = count($a); $i < $c; $i ) {
// ...
}
Ich kannte diese Notation nicht und habe deshalb bei grösseren Arrays stehts die Grösse in einer separaten Zeile ausgelesen. Etwa so ...
$a = array('foo', 'bar', 'lala');
$c = count($a);
for ($i = 0; $i < $c; $i ) {
// ...
}
Dies ist anzuraten, da count() ansonsten bei jeder Iteration ausgeführt wird. Folgende kleine Benchmark zeigt die Differenz gut auf.
foreach (array(1, 100, 1000, 10000, 100000) as $l)
{
echo '<h1>' . $l . '</h1>';
$a = range(1, $i);
$t1 = microtime(true);
for ($i = 0; $i < count($a); $i ) {}
echo round((microtime(true) - $t1) * 1000, 2) . 'ms';
echo '<br />';
$t1 = microtime(true);
for ($i = 0, $c = count($a); $i < $c; $i ) {}
echo round((microtime(true) - $t1) * 1000, 2) . 'ms';
}
| Grösse | Nicht optimiert | Optimiert |
|---|---|---|
| 1 | 0.03ms | 0.02ms |
| 100 | 0.29ms | 0.03ms |
| 1'000 | 3.43ms | 0.27ms |
| 10'000 | 27ms | 2.41ms |
| 100'000 | 272.16ms | 22.88ms |
Da diese Werte teils signifikante Unterschiede aufweisen werde ich mir in Zukunft einfach angewöhnen, stehts die optimierte Notation zu verwenden. So bin ich im Zweifelsfall auf der sicheren Seite und spare sogar eine Zeile Code. ;-)
Ähnliche Artikel
- Statische Methoden sind einfach nur Funktionen - also Vorsicht!
- Properties: Neue Get-/Set-Syntax für PHP?
- PHP zvals und Referenzen erklärt




