2012-05-05 19 views
19

Próbuję porównać te trzy, ale wydaje się tylko array_map działa.array_walk vs array_map vs foreach

$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>"; 
} 

Co robię źle? Oto wynik:

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 

To nie przycinania array_walk i pętla foreach.

+0

Jeśli chcesz poznać wydajność, zobacz wykresy z [artykułu] (https://leve.rs/blog/benchmark-analysis-of-php-array-loops). – Apostle

Odpowiedz

16

Nie ma wpływu na to, co funkcja wyniku daje. Zamiast tego przekazuje zwrotne odwołanie do wartości towaru. Więc twój kod do niego do pracy musi być

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

foreach nie przechowuje zmienione albo sama wartości. Zmień go na

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

Read more about references.

+0

dla foreach: dlaczego muszę go przekazać przez odniesienie? to nie jest właściwa funkcja? – Michelle

+3

To nie jest, prawda. Ale kiedy deklarujesz to bez odniesienia, dostajesz to - wartość, a nie sam przedmiot. Działałoby tylko bez odniesienia, gdyby przedmioty były obiektami. BTW, proponuję zrobić wiele cykli dla metod, które testujesz i drukujesz średnio w X-ach. Twoje działania nie zabierają dużo czasu i mikrosekundy, które podejmują są bardzo przybliżone. – Slava

3

Począwszy od PHP 5.3 Możliwe funkcje anonimowe. z:

$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 ;-) 

Baw się dobrze.

+25

To jedna z brzydko wyglądających tablic. –

+0

W każdym razie wygląda znacznie lepiej niż brzydkie pętle. Dzisiejszy trend używa mniej pętli, ifs, switchów i jest uważany za najlepszą praktykę. –

+0

@ValentinRusk Nie słyszałem nic o tak zwanym "trendzie". Czy możesz rozwinąć? –

Powiązane problemy