2010-06-16 23 views
15

मैं संदर्भ द्वारा एक सरणी तक पहुँचने कर रहा हूँ एक foreach पाश अंदर अंदर एक सरणी तत्व है, लेकिन सेट नहीं() फ़ंक्शन प्रतीत नहीं होता काम करने:अनसेट एक foreach पाश

foreach ($this->result['list'] as &$row) { 
    if ($this_row_is_boring) { 
     unset($row); 
    } 
} 

print_r($this->result['list']); // Includes rows I thought I unset 

विचार? धन्यवाद!

उत्तर

30

आप संदर्भ को अनदेखा कर रहे हैं (संदर्भ तोड़ना)। आप एक कुंजी के आधार पर सेट किए बिना पूरे करने होंगे:

foreach ($this->result['list'] as $key => &$row) { 
    if ($this_row_is_boring) { 
     unset($this->result['list'][$key]); 
    } 
} 
+5

नोट का यह है कि सरणी इंडेक्स संरक्षित हैं, भले ही आपने उन्हें निर्दिष्ट नहीं किया था (स्वचालित संख्यात्मक अनुक्रमणिका) जब सरणी प्रारंभ की गई थी। ऐसा कहने के लिए, यह अनुक्रमिक होने के लिए संख्यात्मक सरणी कुंजियों को फिर से व्यवस्थित नहीं करेगा। – amphetamachine

7
foreach ($this->result['list'] as $key => &$row) { 
    if ($this_row_is_boring) { 
     unset($this->result['list'][$key]); 
    } 
} 
unset($row); 

याद रखें: यदि आप एक संदर्भ के साथ एक foreach उपयोग कर रहे हैं, तो आप भिन्नता को सेट किए बिना उपयोग करती हैं इसलिए कि foreach पर अगले एक कॉपी नहीं है चाहिए इसके ऊपर More info

+1

उम्म, यदि आप किसी संदर्भ के साथ फ़ोरैच का उपयोग कर रहे हैं, तो आपको प्रत्येक लूप पर इसे अनसेट करने की आवश्यकता नहीं है। PHP आपके लिए स्वचालित रूप से करता है। ** लूप के बाद आपको ** इसे अव्यवस्थित करना चाहिए। – ircmaxell

+0

यह सच है ... यह एक टाइपो था। – Cristian

4

ऊपर दिए गए उत्तरों के लिए एक स्पष्टीकरण का थोड़ा सा।

unset($row) के बाद परिवर्तनीय $row अनसेट है। इसका मतलब यह नहीं है कि $row में डेटा हटा दिया गया है; सूची में $row पर इंगित करने वाला तत्व भी है।

यह चर के रूप में चर के बारे में सोचने में मदद करता है। डेटा के एक टुकड़े में एक या अधिक लेबल हो सकते हैं, और unset उस लेबल को हटा देता है लेकिन वास्तविक डेटा को स्पर्श नहीं करता है। यदि सभी लेबल हटा दिए जाते हैं तो डेटा स्वचालित रूप से हटा दिया जाता है।

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