2009-07-21 4 views
0

machen Gibt es eine Möglichkeit, dies schneller zu machen?Wie array loop schneller in PHP

while ($item = current($data)) 
{ 
    echo '<ATTR>',$item, '</ATTR>', "\n"; 
    next($data); 
} 

Ich mag es nicht, dass ich neue Variablen wie $ item erstellen muss.

+4

Sie brauchen tatsächlich die $ item-Deklaration überhaupt nicht. –

+0

Müsstest du nicht einfach $ item = current ($ data) in die while anstelle der Anweisung schreiben? –

+0

Ich überprüfte mit Microtime für die Geschwindigkeit. Und es scheint, dass die Verwendung von "while (current ($ data))" langsamer ist als "while ($ item = current ($ data))" aber sehr wenig. Die Verwendung von foreach ist wesentlich schneller. –

Antwort

4
<?php 
$transport = array('foot', 'bike', 'car', 'plane'); 

foreach ($transport as $value) { 
    echo $value; 
} 
?> 
+0

mit foreach machte es schneller –

0

Sie könnten eine foreach, aber dann würden Sie 2 neue Variablen erstellen. Es sei denn, Sie mögen einfach nicht die Idee, Variablen innerhalb der while() -Klausel zuzuweisen.

foreach($data as $key => $value) 
{ 
    echo $key . " => ".$value; 
} 

In beiden Fällen müssen Sie eine tatsächliche Variable erstellen.

1

Wenn Sie nicht wollen, temporäre Variablen erstellen, tun Sie es wie folgt aus:

while (current($data)) 
{ 
    echo '<ATTR>',current($data), '</ATTR>', "\n"; 
    next($data); 
} 

aber ich weiß nicht, ob dies wirklich es schneller machen. Sie würden nur sagen, wäre mit einem Profiler, aber es ist so eine Mikro-Optimierung Ich bezweifle, dass Sie den Unterschied bemerken werden.

Der beste Weg, um die Schleife zu beschleunigen wäre, einen schnelleren Computer zu verwenden.

+0

Einverstanden, und wenn die Schleife groß genug ist, um dort einen spürbaren Unterschied zu sein, dann wird die Zeit, die der Server benötigt, um die Antwort zurückzuschicken, die Zeit gespart, die es optimiert. –

+0

Ich habe mit microtime() nach Geschwindigkeit gesucht und foreach ist schneller als current() und next(). –

+0

Ja, aber du hast gesagt, dass du diese temporären Variablen nicht erstellen willst - mit der 'foreach'-Schleife erstellst du 2 davon! –

1

Wenn Sie nur den obigen Code verwenden, können Sie eine Implodierungsanweisung verwenden.


if (count($data) > 0) { 
    echo "<ATTR>".implode("</ATTR>\n<ATTR>", $data)."</ATTR>"; 
} 
+0

Sie meinen implode ("\ n", $ data); –

+0

Bei der Verarbeitung wird wahrscheinlich die gleiche (Mikro-) Zeit benötigt, da dies wahrscheinlich eine foreach-Schleife ist. –

+1

Ahh, er hat seinen Post bearbeitet ... –

1

$ nl = "\ n";

Speichern Sie das Newline-Zeichen in einer Variablen, anstatt PHP die doppelten Anführungszeichen in jeder Iteration analysieren zu lassen.

+0

Das ist ein guter Tipp, danke. –

+2

Alex. Verwenden Sie PHP_EOL, anstatt \ n als Variable zu speichern. – hobodave

0

Was ist diese:

function my_func($str) { 
    echo "<attr>{$str}</attr>\n"; 
} 
array_map('my_func', $data); 

(Sollte funktionieren, aber ich bin neugierig die Geschwindigkeit im Vergleich zu einem foreach Loop)

Oder wenn Sie mit PHP> = 5.3 (wahrscheinlich nicht Ihr Fall, btw), können Sie dieses verwenden, basierend auf einer Lambda-Funktion:

array_map(function ($item) { 
    echo "<attr>{$item}</attr>\n"; 
}, $data); 

Fast die gleiche, aber ohne eine Funktion deklarieren, die nur einmal im Programm verwendet wird.