2013-02-12 8 views
7

मेरा नमूना कोड क्यों पहली स्ट्रिंग में पीछे की जगह है?PHP में array_walk या array_map के लिए कॉलबैक के रूप में कार्य को ट्रिम क्यों नहीं करेगा?

$a=array('test_data_1 ','test_data_2'); 
array_walk($a, 'trim'); 
array_map('trim', $a);      
foreach($a AS $b){ 
    var_dump($b); 
} 

स्ट्रिंग (12) "test_data_1" स्ट्रिंग (11) "test_data_2"

उत्तर

36

पहले, array_walk गलत है अपने उद्देश्य के लिए बिल्कुल काम करें।

दूसरा, array_map मूल सरणी नहीं बदलता है लेकिन मैप किए गए सरणी को वापस करता है। तो आप क्या जरूरत है:

$a = array_map('trim', $a); 
+1

धन्यवाद, क्या याद आया कि array_map वापस लौटा रहा था - लेकिन पल्स आप निर्दिष्ट कर सकते हैं कि आप गलत कार्य के रूप में array_walk को क्यों समेकित करेंगे? –

+8

यदि आप [मैन्युअल] (http://php.net/array-walk) पढ़ते हैं तो आप देखेंगे कि array_walk सिर्फ ** कॉल ** एक सरणी के प्रत्येक मान (और कुंजी) के साथ एक फ़ंक्शन है। तो इसका वही प्रभाव होगा: 'ट्रिम (' test_data_1 ', 0); ट्रिम करें ('test_data_2', 1) '- कोई असाइनमेंट नहीं, कोई दुष्प्रभाव नहीं है (और रास्ते में ट्रिम के लिए गलत दूसरा पैरामीटर)। आप निश्चित रूप से array_walk के लिए अपना स्वयं का फ़ंक्शन लिख सकते हैं, जो तब वास्तविक सरणी तत्व को ट्रिम करता है। –

0

array_map एक नई सरणी लौटने के लिए, कोशिश इस

$a=array('test_data_1 ','test_data_2'); 
array_walk($a, 'trim'); 
$a = array_map('trim', $a); 
foreach($a AS $b){ 
    var_dump($b); 
} 
0

trim() हम उसकी जांच करने, या यह डालने से पहले डेटा तैयार करने के लिए अच्छा है। हालांकि, आप शायद ट्रिम से अधिक के साथ तैयार करना चाहते हैं। एक शांत तकनीक मैं पहले देखा है अपने की तैयारी कार्यों के माध्यम से "पाइप" के लिए है:

$data = prepare($data, array(
    'first_name' => 'trim|custom_function', 
    'surname' => 'trim', 
)); 

यह इस तरह से कर रही है की सुंदरता कोड आसानी से पढ़ने योग्य बनाता है और यह प्रत्येक विशिष्ट सरणी तत्वों पर कार्यों को चलाने के लिए अविश्वसनीय रूप से आसान है।

यहाँ एक समारोह मैं जल्दी से खटखटाया है या नहीं:

function prepare($data, $arr){ 
    foreach($arr as $input_name => $functions){ 
    foreach(explode('|', $functions) as $function){ 
     $data[$input_name] = call_user_func($function, $data[$input_name]); 
    } 
    } 
    return $data; 
} 
+4

हे, क्षमा करें, लेकिन आपका उत्तर –

+0

@ JaakKütt से ऊपर के प्रश्न के लिए प्रासंगिक प्रतीत नहीं होता है, लेकिन डेटा तैयार करने के लिए सरणी मानों को ट्रिम करना है। कभी-कभी यह डेवलपर के लक्ष्य के लिए एक और अधिक लचीला दृष्टिकोण का सुझाव देने में मदद करता है। – rybo111

3

array_walk के लिए सरणी में आइटम (मान) को संशोधित करने, कॉलबैक एक समारोह है कि संदर्भ से अपनी पहली पैरामीटर लेता है और उसे संशोधित किया जाना चाहिए (जो सादे trim का मामला नहीं है), तो आपके कोड बन जाएगा:

$a=array('test_data_1 ','test_data_2'); 
array_walk($a, function (&$value) { $value = trim($value); }); // by-reference modification 
// (no array_map) 
foreach($a AS $b){ 
    var_dump($b); 
} 

वैकल्पिक रूप से, array_map के साथ वापसी मान के साथ सरणी पुन: असाइन करना होगा, ताकि अपने कोड बन जाएगा:

$a=array('test_data_1 ','test_data_2'); 
// (no array_walk) 
$a = array_map('trim', $a); // array reassignment 
foreach($a AS $b){ 
    var_dump($b); 
} 
संबंधित मुद्दे