2012-11-07 8 views
16

मैं अपने पाइप सीमित स्ट्रिंग को एक सहयोगी सरणी में परिवर्तित करने के लिए सरणी फ़ंक्शंस का उपयोग कर रहा हूं।array_walk फ़ंक्शन में सरणी कुंजियां बदल रहा है?

array (size=4) 
    "k" => string 'f' (length=1) 
    "p" => string 't' (length=1) 
    "e" => string 'r' (length=1) 
    "t" => string 'm' (length=1) 

लेकिन कुंजी अनछुए हैं:

$piper = "|k=f|p=t|e=r|t=m|"; 

$piper = explode("|",$piper); 

$piper = array_filter($piper); 

function splitter(&$value,$key) { 

    $splitted = explode("=",$value); 
    $key = $splitted[0]; 
    $value = $splitted[1]; 

} 

array_walk($piper, 'splitter'); 

var_dump($piper); 

यह मेरे

array (size=4) 
    1 => string 'f' (length=1) 
    2 => string 't' (length=1) 
    3 => string 'r' (length=1) 
    4 => string 'm' (length=1) 

जहां मैं चाहता हूँ देता है। क्या कोई सरणी फ़ंक्शन है जिसके साथ मैं सरणी पर लूप कर सकता हूं और कुंजी और मान भी बदल सकता हूं?

+0

क्या वांछित जिसके परिणामस्वरूप सरणी है? –

+0

@JasonMcCreary: मैंने इसे – mithunsatheesh

+2

अपडेट किया है संपादित करें: "जो सबसे तेज़ है" अब यह मेरी आंखों में एक रचनात्मक सवाल नहीं बनाता है। नीचे मेरी टिप्पणी देखें। 'उपयोग' के लिए – hakre

उत्तर

43

यह array_walk के दस्तावेज में कहा है (कॉलबैक फ़ंक्शन का वर्णन):

केवल सरणी के मूल्यों संभावित बदला जा सकता है; इसकी संरचना को बदला नहीं जा सकता है, यानी, प्रोग्रामर तत्वों को जोड़, अनसेट या पुन: व्यवस्थित नहीं कर सकता है। यदि कॉलबैक इस आवश्यकता का सम्मान नहीं करता है, तो इस फ़ंक्शन का व्यवहार अपरिभाषित है, और अप्रत्याशित है।

इसका मतलब है कि आप पुनरावृत्त सरणी की कुंजी को बदलने के लिए array_walk का उपयोग नहीं कर सकते हैं। हालांकि, आप इसके साथ एक नई सरणी बना सकते हैं:

$result = array(); 
array_walk($piper, function (&$value,$key) use (&$result) { 
    $splitted = explode("=",$value); 
    $result[ $splitted[0] ] = $splitted[1]; 
}); 
var_dump($result); 

फिर भी, मुझे लगता है कि अगर यह मेरे थे, मैं regex यहाँ का उपयोग करें (के बजाय "विस्फोट विस्फोट"):

$piper = "|k=f|p=t|e=r|t=m|"; 
preg_match_all('#([^=|]*)=([^|]*)#', $piper, $matches, PREG_PATTERN_ORDER); 
$piper = array_combine($matches[1], $matches[2]); 
var_dump($piper); 
+2

+1। एक अनुस्मारक के लिए PHP 5.3+ की आवश्यकता है। –

+0

ठीक है, यह एक साधारण फोरैच पुनरावृत्ति की तुलना में ओवरहेड है जिसमें पहले से ही कोड शामिल है और स्कॉप्स में चर पारित करने की आवश्यकता नहीं है। – hakre

+0

आप array_walk का उपयोग क्यों करेंगे और इस उद्देश्य के लिए एक साधारण foreach नहीं? –

2

इसके लिए आप foreach का बेहतर उपयोग कर सकते हैं। निम्न उदाहरण एक प्रविष्टि को संसाधित करता है, इसे सही कुंजी के साथ जोड़ता है और मूल प्रविष्टि को हटा देता है।

$piper = "|k=f|p=t|e=r|t=m|"; 
$piper = array_filter(explode("|", $piper)); 

foreach ($piper as $index => $value) { 
    list($key, $value) = explode("=", $value); 
    $piper[$key] = $value; 
    unset($piper[$index]); 
} 

ध्यान रखें कि आपके पास एक इंडेक्स की तरह कुंजी नहीं है।

foreach ($piper as &$value) { 
    list($keys[], $value) = explode("=", $value); 
} 
unset($value); 

$piper = array_combine($keys, $piper); 

यह किसी भी मुसीबतों में आप नहीं लाती लेकिन सिर्फ डुप्लिकेट चाबी के साथ:

एक अन्य विकल्प के लिए एक संदर्भ के माध्यम से मूल्यों की प्रक्रिया और बाद में चाबियाँ स्थापित करने के लिए है। लेकिन आप foreach के बाद उस समस्या की जांच कर सकते हैं, कोई डेटा खो जाएगा नहीं।

कुछ निम्नलिखित foreach शायद सबसे परिणामस्वरूप सरणी में stroing द्वारा सरल है, जिसके साथ इसकी गारंटी नहीं किया जा सकता है कि:

$result = array(); 
foreach ($piper as $value) { 
    list($key, $value) = explode("=", $value); 
    $result[$key] = $value; 
} 
+0

'$ पाइपर 'का पुन: उपयोग क्यों करें? –

+1

@ जेसनएमसीक्रैरी: मैंने एक दूसरा उदाहरण जोड़ा जो मूल्य को फिर से उपयोग करता है जो अधिक उपयुक्त है। किसी भी मामले में '$ पाइपर 'प्रसंस्करण के लिए है इसलिए मुझे इसका उपयोग करने में कोई समस्या नहीं दिख रही है (इसे फिर से उपयोग नहीं करें)। – hakre

+0

कृपया मुझे बताएं कि कौन सा सबसे तेज़ निष्पादित करेगा? foreach या regex या यह array_walk है? – mithunsatheesh

3

क्यों एक नई सरणी $ पाइपर से वांछित कुंजी और मूल्यों है कि निर्माण नहीं ?

$piper2 = array(); 
foreach ($piper as $k => $val) 
{ 
    $splitted = explode("=", $val); 
    $key = $splitted[0]; 
    $value = $splitted[1]; 

    $piper2[$key] = $value; 
} 

$piper = $piper2; // if needed 
+0

कृपया मुझे सुझाव दें कि कौन सा सबसे तेज़ निष्पादित करेगा? foreach या regex या यह array_walk है? – mithunsatheesh

0

का उपयोग array_reduce इस आधार पर चाल

$piper = "|k=f|p=t|e=r|t=m|"; 

$piper = explode("|",$piper); 

$piper = array_filter($piper); 

function splitter($result, $item) { 
    $splitted = explode("=",$item); 
    $key = $splitted[0]; 
    $value = $splitted[1]; 

    $result[$key] = $value; 

    return $result; 
} 

$piper = array_reduce($piper, 'splitter', array()); 

var_dump($piper); 

करना होगा: http://www.danielauener.com/howto-use-array_map-on-associative-arrays-to-change-values-and-keys/

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