2012-05-05 17 views
19

मैं इन तीनों की तुलना करने की कोशिश कर रहा हूं लेकिन ऐसा लगता है कि केवल 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_walk के लिए ट्रिमिंग नहीं कर रहा है और foreach पाश: यहाँ उत्पादन है।

+0

यदि आप प्रदर्शन को जानना चाहते हैं, तो [आलेख] (https://leve.rs/blog/benchmark-analysis-of-php-array-loops) से आलेख देखें। फोरच के लिए – 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

यह सही नहीं है। लेकिन जब आप किसी संदर्भ के बिना इसे घोषित करते हैं जो आपको मिलता है - एक मूल्य, आइटम नहीं। आइटम केवल वस्तुएं होने पर ही संदर्भ के बिना काम करेंगे। बीटीडब्ल्यू, मैं सुझाव दूंगा कि आप जिस तरीके से परीक्षण कर रहे हैं उसके लिए एकाधिक चक्र करें और एक्स रन पर औसत प्रिंट करें। आपके कार्यों में वास्तव में अधिक समय नहीं लगता है और वे जो माइक्रोसॉन्ड लेते हैं वे बहुत अनुमानित होते हैं। – 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

किसी भी तरह यह बदसूरत loops से बेहतर दिखता है। आज की प्रवृत्ति कम लूप, आईएफएस, स्विच का उपयोग कर रही है और सर्वोत्तम प्रथाओं के रूप में सामने आई है। –

+0

@ वेलेंटीनस्कस्क मैंने तथाकथित "प्रवृत्ति" के बारे में कुछ भी नहीं सुना। क्या आप विस्तार से समझा सकते हैं? –

संबंधित मुद्दे