2012-05-05 21 views
19

私はこれら3つを比較しようとしていますが、それはarray_mapのようです。array_walk対array_map対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>"; 
} 

私は間違っていますか?出力は次のとおりです。

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 

それはarray_walkforeachループのためのトリミングいません。

+0

パフォーマンスを知りたい場合は、[記事](https://leve.rs/blog/benchmark-analysis-of-php-array-loops)のグラフを参照してください。 foreachのための – Apostle

答えて

16

array_walkは、関数の結果がどのようなものかを見ていません。代わりに、コールバックに項目値への参照を渡します。だから、仕事にそれのためのあなたのコードは、

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

foreach

はどちらか変更された値自体を格納しませんする必要があります。

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

Read more about referencesに変更してください。

+0

:なぜ私はそれを参照によって渡す必要がありますか?それは機能の権利ではないのですか? – Michelle

+3

そうではありません。しかし、あなたが得るものである参照なしにそれを宣言するとき、それは価値であり、商品そのものではありません。アイテムがオブジェクトの場合は、参照なしでしか機能しません。ところで、私はあなたがテストしているメソッドと複数のサイクルを実行することをお勧めしますXの平均印刷を実行します。あなたの行動は実際には時間がかかりませんし、マイクロ秒で近似します。 – Slava

3

PHP 5.3匿名機能が可能です。 例:

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

楽しんでください。

+25

それは一見醜い一見です。 –

+0

とにかく醜いループよりもはるかによく見えます。今日の傾向は、より少ないループ、if、スイッチを使用しており、ベストプラクティスとして遭遇しています。 –

+0

@ValentinRuskいわゆる「トレンド」について何も聞いていませんでした。あなたは精緻化できますか? –

関連する問題