2011-07-19 5 views
12

के बाद नहीं रहता।पीएचपी: की जगह सरणी मान मैं एक बहु-आयामी सरणी में मान परिवर्तित कर रहा हूँ और यह foreach पाश है कि यह पार करने के लिए इस्तेमाल किया जा रहा से बाहर रहने नहीं कर रहा है foreach पाश

Array 
{ 
    [0] => Array 
    { 
    [name] => Bob 
    [age] => 33 
    [state] => CA 
    [visited] => 0 
    } 
    ... 
} 

मेरे पीएचपी यह में हो जाता है के लिए जा रहा द्वारा:

मेरे सरणी शुरू में कुछ इस तरह दिखता

foreach ($people as $person){ 
echo $person['name'] 
.... 
logic for the visited variable 
... 
$person['visited'] = $calculated_visit_value; 
} 

अगर मैं

print_r($person) 
अंत में

(लेकिन अंदर) foreach पाश सब कुछ अच्छा लग रहा है, दौरा के लिए मूल्य निर्धारित है। हालांकि, अगर मैं print_r($people) लूप के बाहर, $person['visited'] सेट नहीं है। मुझे नहीं पता कि मैं क्या गलत कर रहा हूं।

सहायता की सराहना की जाती है।

+2

अपने foreach द्वारा किए गए सरणी की एक प्रतिलिपि (* * $ के रूप में ...) –

उत्तर

36

आप पाश के लिए है कि भीतर से $person नामक एक नया चर पैदा कर रहे है और अपने सरणी है कि नए चर का दायरा कभी नहीं देखेंगे।

आप संदर्भ द्वारा इसे पारित, तो तरह की कोशिश कर सकते हैं:

foreach ($people as &$person){ 
echo $person['name']; 
.... 
logic for the visited variable 
... 
$person['visited'] = $calculated_visit_value; 
} 
+2

हाँ यह है कि संपादन! धन्यवाद। मुझे इसे सही के रूप में चिह्नित करने के लिए 7 मिनट का इंतजार करना होगा, लेकिन यह पूरी तरह से काम करता है। – mikepreble

+2

यह काम करता है। बीटीडब्ल्यू, यह उत्तर अभी तक स्वीकार नहीं किया गया है। – Guus

+2

यह पूरी तरह से काम करता है और सही उत्तर के रूप में चिह्नित किया जाना चाहिए। – Joseph

0

$person सरणी प्रत्येक यात्रा पर उत्पन्न होता है, तो सेट करते हैं कि मूल्य अगले पर ओवरराइट किया जाएगा वैसे भी के माध्यम से जाना।

लेकिन फिर भी, यह सरणी केवल लूप के दौरान मौजूद है। आपको लूप से पहले एक और सरणी बनाना चाहिए और लूप के दौरान अपने मानों को उस सरणी में रखना चाहिए।

3

foreach's documentation से:

जब तक सरणी संदर्भित है, foreach निर्दिष्ट सरणी की एक प्रति और न सरणी पर ही चल रही है। foreach सरणी सूचक पर कुछ पक्ष प्रभाव है। के दौरान सरणी सूचक पर भरोसा न करें या इसे रीसेट किए बिना प्रचार के बाद।

इसका मतलब क्या है कि आपके $ व्यक्ति चर आप चाहते हैं वास्तव में क्या है, इस कोड को प्रभावी बनाने में इसी तरह की सरणी में था की एक प्रति है (ध्यान दें कि इस कोड कई स्तरों पर केवल और गलत को समझने के लिए है, है) ठीक से अपने सरणी पर रीसेट(), वर्तमान() और अगले() फ़ंक्शन पाश करने के लिए उपयोग करते हैं, see here:

for ($i = 0; $i < count($people); $i++) { 
    $person = $people[$i]; 
    // code inside your foreach ... 
} 

तो अगर आप $ व्यक्ति की सामग्री को बदल, आप वास्तव में बदलाव न करें अंदर क्या है $ लोग सरणी

इसे हल करने के लिए, आप या तो एक संदर्भित foreach का उपयोग कर सकते हैं:

foreach ($people as &$person) { // note the & 
    $person = $calculated_visit_value; // $person is now a reference to the original value inside $people and thus this will work as intended 
} 

ध्यान दें कि refence में अवरोध है जब foreach पाश समाप्त होता है, तो यह के अंत में $ व्यक्ति अभी भी $ लोगों के अंतिम तत्व के लिए संदर्भ है। यदि आपको नहीं पता कि संदर्भ क्या हैं, तो कृपया अधिक जानकारी के लिए the documentation देखें।

या मूल सरणी तक पहुँचने के लिए कुंजी का उपयोग करें: आपकी जानकारी के लिए

foreach ($people as $person_index => $person) { 
    $people[$person_index] = $calculated_visit_value; 
} 

, तो आप उपयोग कर सकते हैं दोनों एक साथ

foreach ($people as $person_index => &$person { ... 
0

के रूप में यह कहा गया है, "आप एक नया निर्माण कर रहे हैं चर के लिए उस व्यक्ति से $ व्यक्ति कहा जाता है और आपकी सरणी उस नए चर के दायरे को कभी नहीं देख पाएगी। "

मैं इस समाधान और अधिक मजबूत लगता है:

foreach ($people as $key => $person) 
{ 
    echo $person['name']; 

    //logic for the visited variable 

    $people[$key]['visited']=$calculated_visit_value; 
} 
संबंधित मुद्दे