2011-08-20 16 views
9

पर आधारित बहु-आयामी सरणी से तत्व हटाएं मैं एक बहु-आयामी सरणी से एक कुंजी को कैसे हटा सकता हूं?कुंजी

मैं उम्मीद कर रहा हूं कि यह लालची हो ताकि यह एक सरणी में सभी तत्वों को हटा दे जो कि मेरे द्वारा पास की जाने वाली कुंजियों से मेल खाते हैं। मेरे पास यह अब तक है जहां मैं बहु-आयामी सरणी को पार कर सकता हूं लेकिन मैं इसे अनसेट नहीं कर सकता कुंजी मुझे इसकी आवश्यकता है क्योंकि मेरे पास इसका कोई संदर्भ नहीं है!

function traverseArray($array, $keys) 
{ 
    foreach($array as $key=>$value) 
    { 
     if(is_array($value)) 
     { 
      traverseArray($value); 

     } else { 

      if(in_array($key, $keys)) 
      {      
       //unset(what goes here?) 

      } 

     } 
    } 

} 
+0

मुझे लगता है कि 'कॉल-टाइम पास-बाय-रेफरेंस को हटा दिया गया है'। खासकर जब से मैं कोड-इग्निटर में एक वर्ग में इसका उपयोग कर रहा हूं। – Abs

उत्तर

8

निम्नलिखित कोड काम करता है (और पदावनत सामान का उपयोग नहीं करता), बस इसे परीक्षण किया :

function traverseArray(&$array, $keys) { 
    foreach ($array as $key => &$value) { 
    if (is_array($value)) { 
     traverseArray($value, $keys); 
    } else { 
     if (in_array($key, $keys)){ 
     unset($array[$key]); 
     } 
    } 
    } 
} 
+0

यह बहुत उपयोगी था, धन्यवाद @Marian।यदि कोई इसका उपयोग करता है और आप जिस तत्व को हटा रहे हैं उसके VALUE पर चेक करना चाहता है, तो आप 'unset() 'करने से पहले' $ value' की जांच कर सकते हैं; – Jimbo

0

आप इस

unset($array[$key]); 

क्योंकि $array कर मूल सरणी की एक प्रति, यह करने के लिए सिर्फ एक संदर्भ नहीं होगा सकता है, इसलिए किसी भी संशोधन का आयोजन करेगा।

इसके अलावा, आपके स्निपेट में एक छोटी सी बग है: जब आप रिकर्सिव कॉल करते हैं, तो आप $keys पैरामीटर को पास करना भूल जाते हैं।

+1

केवल तभी जब आप संदर्भ से गुजरते हैं ... जो डिफ़ॉल्ट संस्करण नहीं है ... – sg3s

+0

@ sg3s नए संस्करणों में (php5.x, निश्चित रूप से नहीं जानते) यह डिफ़ॉल्ट + पास-दर-संदर्भ '& $ var' बहिष्कृत है। स्पष्टीकरण के लिए यह उत्तर देखें (http://stackoverflow.com/questions/6138454/php-arrays-and-pass-by-reference)। –

+0

मुझे यकीन है कि @ sg3 का अधिकार है। फ़ंक्शन कॉल में '&', 'foo (&$a);' मैन्युअल के अनुसार बहिष्कृत किया गया है, लेकिन अन्यथा यह कहता है कि' फ़ंक्शन foo (& $ var) {' – joakimdahlstrom

1

आप संदर्भ द्वारा पारित इस्तेमाल कर सकते हैं, इस तरह अपने कार्य की घोषणा:

function traverseArray(&$array, $keys) 
{ 
    foreach($array as $key=>$value) 
    { 
     if(is_array($value)) 
     { 
      traverseArray($value, $keys); 
     }else{ 
      if(in_array($key, $keys)){ 
       unset($array[$key]); 
      } 
     } 
    } 
} 

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

unset($array[$key]); 

अधिक जानकारी के लिए php documentation on passing by reference

+0

मुझे यह संदेश मिलता है 'कॉल-टाइम पास-बाय- संदर्भ को हटा दिया गया है। मैं इसे कोडिग्निटर में एक वर्ग में उपयोग कर रहा हूं। – Abs

+0

मैंने अपना पूरा फ़ंक्शन शामिल करने के लिए अपना उत्तर संपादित किया। इसके अतिरिक्त आपको यह सुनिश्चित करने की आवश्यकता है कि जब आप इसे कॉल करते हैं तो आप 'ट्रैवर्सएरे ($ सरणी, $ कुंजी)' और ** नहीं ** 'ट्रैवर्सअरे (और $ सरणी, $ कुंजी)' – sg3s

+0

ठीक है, मुझे अब यह त्रुटि नहीं मिल रही है। हालांकि, सरणी पहले जैसा ही है। मुझे आश्चर्य है कि यह वास्तव में कक्षा में काम कर सकता है? मैं उपर्युक्त फ़ंक्शन को कक्षा में किसी अन्य फ़ंक्शन से कॉल कर रहा हूं और यह फ़ंक्शन कुछ भी वापस नहीं कर रहा है। जिस तरह से मैं इसे कॉल करता हूं वह ऐसा है: '$ this-> ट्रैवर्सअरे ($ त्रुटियां, सरणी ('e1', 'e2')); ' – Abs

0

की जाँच करें और भूल नहीं है संशोधित करने के लिए foreach:

foreach($array as $key=>&$value) 
+0

एक बार वैरिएबल का संदर्भ देने के बाद आपको ऐसा करने की आवश्यकता नहीं है, यह उस परिवर्तनीय afaik के सभी उपयोगों के माध्यम से इसे ले जाएगा (किसी को इसका परीक्षण करने में लगता है?: पी) – sg3s

+0

आप फोरैच में सरणी मानों को नहीं बदल सकते हैं। –

+0

डाउनवॉटिंग का कारण क्या है? –

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