array_walk vs. array_map vs. foreach

Lesezeit: 3 Minuten

Ich versuche, diese drei zu vergleichen, aber es scheint nur array_map funktioniert.

$input = array( '  hello   ','whsdf                                    ','                              lve you','                              ');
$input2 = array( '  hello   ','whsdf                                    ','                              lve you','                              ');
$input3 = array( '  hello   ','whsdf                                    ','                              lve you','                              ');

$time_start = microtime(true);
$input = array_map('trim',$input);
$time_end = microtime(true);
$time = $time_end - $time_start;

echo "Did array_map in $time seconds<br>";

foreach($input as $in){
    echo "'$in': ".strlen($in)."<br>";
}

////////////////////////////////////////////////

$time_start = microtime(true);
array_walk($input2,'trim');
$time_end = microtime(true);
$time = $time_end - $time_start;

echo "Did array_walk in $time seconds<br>";

foreach($input2 as $in){
    echo "'$in': ".strlen($in)."<br>";
}

////////////////////////////////////////////////


$time_start = microtime(true);
foreach($input3 as $in){
    $in = trim($in);
}
$time_end = microtime(true);
$time = $time_end - $time_start;

echo "Did foreach in $time seconds<br>";

foreach($input3 as $in){
    echo "'$in': ".strlen($in)."<br>";
}

Was mache ich falsch? Hier ist die Ausgabe:

Did array_map in 0.00018000602722168 seconds
'hello': 5
'whsdf': 5
'lve you': 7
'': 0
Did array_walk in 0.00014209747314453 seconds
' hello ': 10
'whsdf ': 41
' lve you': 37
' ': 30
Did foreach in 0.00012993812561035 seconds
' hello ': 10
'whsdf ': 41
' lve you': 37
' ': 30

Es ist kein Trimmen für array_walk und die foreach Schleife.

  • Wenn Sie die Leistung wissen wollen, sehen Sie sich die Grafiken an der Artikel.

    – Apostel

    19. Februar 2015 um 12:04 Uhr

Benutzer-Avatar
Slava

array_walk schaut nicht, was die Ergebnisfunktion gibt. Stattdessen übergibt es einen Callback-Verweis auf den Elementwert. Ihr Code muss also sein, damit es funktioniert

function walk_trim(&$value) {
    $value = trim($value);
}

foreach speichert selbst auch keine geänderten Werte. Ändern Sie es in

foreach ($input3 as &$in) {
    $in = trim($in);
}

Lesen Sie mehr über Referenzen.

  • für die foreach: warum muss ich es als referenz übergeben? das ist doch keine funktion oder?

    – Jürgen Paul

    5. Mai 2012 um 3:55 Uhr

  • Ist es nicht, richtig. Aber wenn Sie es ohne Referenz deklarieren, erhalten Sie genau das – einen Wert, nicht das Element selbst. Ohne Referenz würde es nur funktionieren, wenn Items Objekte wären. Übrigens würde ich vorschlagen, dass Sie mehrere Zyklen für die Methoden durchführen, die Sie testen, und den Durchschnitt bei X-Läufen drucken. Ihre Aktionen nehmen nicht wirklich viel Zeit in Anspruch und Mikrosekunden, die sie benötigen, sind sehr ungefähr.

    – Slava

    5. Mai 2012 um 3:57 Uhr


Ab PHP5.3 Anonyme Funktionen möglich. ex:

$arr = array('1<br/>','<a href="#">2</a>','<p>3</p>','<span>4</span>','<div>5</div>');
array_walk($arr, function(&$arg){
    $arg = strip_tags($arg);
});
var_dump($arr); // 1,2,3,4,5 ;-)

Habe Spaß.

  • Das ist ein hässlich aussehendes Array.

    – Andreas Larson

    2. Oktober 2013 um 15:54 Uhr

  • Auf jeden Fall sieht es viel besser aus als hässliche Schleifen. Der heutige Trend geht dahin, weniger Schleifen, Ifs und Switches zu verwenden, und gilt als Best Practice.

    – Valentin Rusk

    13. Januar 2014 um 8:01 Uhr

  • @ValentinRusk Ich habe nichts über den sogenannten “Trend” gehört. Können Sie das näher erläutern?

    – Peter Peller

    18. Juli 2014 um 11:45 Uhr

  • @ValentinRusk Die Entwurfsmuster/Prinzipien haben nichts mit der Verwendung von array_walk gegen foreach zu tun. Keines davon verwendet überhaupt Objekte. Wie hängt das dann mit OOP zusammen? 🙂

    – Peter Peller

    20. Juli 2014 um 12:13 Uhr


  • OOP rät nicht von der Verwendung von Schleifen ab… SOLID hat nichts mit Schleifen zu tun. In der Tat, array_map ist ein funktionales Programmierparadigma en.wikipedia.org/wiki/Map_%28higher-order_function%29

    – Populus

    25. Juli 2014 um 20:01 Uhr

1054480cookie-checkarray_walk vs. array_map vs. foreach

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy