फ़ॉरेस्ट लूप के अंदर सरणी से ऑब्जेक्ट को कैसे हटाएं?


140

मैं वस्तुओं की एक सरणी के माध्यम से पुनरावृत्ति करता हूं और 'आईडी' संपत्ति के आधार पर वस्तुओं में से एक को हटाना चाहता हूं, लेकिन मेरा कोड काम नहीं करता है।

foreach($array as $element) {
    foreach($element as $key => $value) {
        if($key == 'id' && $value == 'searched_value'){
            //delete this particular object from the $array
            unset($element);//this doesn't work
            unset($array,$element);//neither does this
        } 
    }
}

कोई सुझाव। धन्यवाद।


2
एक डुप्लिकेट लूप में सरणी तत्व
7hi4g0

जवाबों:


233
foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        if($valueKey == 'id' && $value == 'searched_value'){
            //delete this particular object from the $array
            unset($array[$elementKey]);
        } 
    }
}

62
क्या उसी सरणी के फॉरेस्ट लूप के भीतर किसी ऐरे के तत्व को निकालना सुरक्षित है?
ओलिवियर पोंस

25
@ ओलिवर: आमतौर पर यह अप्रत्याशित व्यवहार उत्पन्न करेगा, लेकिन आप इसे सुरक्षित रूप से php पर फॉर्चून के साथ कर सकते हैं। एक परीक्षण के लिए यहाँ पढ़ें: php.net/manual/en/control-structures.foreach.php#88578
pangon

1
@Paritosh मुझे पता है कि आपने इसे बहुत पहले पोस्ट किया था, लेकिन यह इसलिए है क्योंकि PHP साहचर्य सरणियों का उपयोग करता है। तो आपके पास एक इंडेक्स है जो डिलीट हो गया है: और यह JSON से ऑब्जेक्ट के रूप में एनकोड हो रहा है। समझ में आता है, क्योंकि एक साहचर्य सरणी एक "शब्दकोश है।" साथ आने वाले किसी व्यक्ति की मदद कर सकते हैं।
रयान ओ'डॉनेल 15

1
क्या आपको वास्तव में प्रत्येक के लिए दूसरा करने की आवश्यकता है? क्या आप केवल ऑब्जेक्ट की वांछित 'आईडी' संपत्ति को क्वेरी नहीं कर सकते हैं? क्यों अन्य सभी सहारा की जाँच करें।
htafoya

3
@htafoya नहीं आप बस if(isset($element['id']) && $element['id'] == 'searched_value') { unset($array[$elementKey]); }मुझे उस समय के बारे में सोच सकते हैं जब मैंने उसे कॉपी किया और उसे unsetठीक से दिखाने के लिए अपने कोड को संशोधित किया ।
prodigitalson

2

ऐसा लग रहा है कि बिना किसी बाधा के आपका सिंटैक्स अमान्य है, और रीइन्डेक्सिंग की कमी से भविष्य में परेशानी हो सकती है। देखें: PHP सरणियों पर अनुभाग

सही सिंटैक्स ऊपर दिखाया गया है। रींडेक्सिंग के लिए सरणी-मानों को भी ध्यान में रखें , ताकि आप कभी भी उस चीज़ को अनुक्रमित न करें जिसे आपने पहले हटाया था।


2

आप foreachमानों पर संदर्भ भी उपयोग कर सकते हैं :

foreach($array as $elementKey => &$element) {
    // $element is the same than &$array[$elementKey]
    if (isset($element['id']) and $element['id'] == 'searched_value') {
        unset($element);
    }
}

9
$ तत्व (फ़ॉर्च के अंदर और बाहर) सरणी में प्रत्येक तत्व का एक संदर्भ है। अनसेट ($ तत्व) केवल संदर्भ को तोड़ देगा, यह संदर्भित तत्व को उसके सरणी से नष्ट नहीं करता है।
निकोलस

3
@Dev_NIX $element = nullकाम नहीं करेगा, इसकी लंबाई $arrayएक समान है, इसमें बस नल होंगे
निको वेस्टरडेल

1

यह काम कर जाना चाहिए.....

reset($array);
while (list($elementKey, $element) = each($array)) {
    while (list($key, $value2) = each($element)) {
        if($key == 'id' && $value == 'searched_value') {
            unset($array[$elementKey]);
        }
    }
}

1

मुख्य उत्तर से सावधान रहें।

साथ में

[['id'=>1,'cat'=>'vip']
,['id'=>2,'cat'=>'vip']
,['id'=>3,'cat'=>'normal']

और फ़ंक्शन को कॉल कर रहा है

foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        if($valueKey == 'cat' && $value == 'vip'){
            //delete this particular object from the $array
            unset($array[$elementKey]);
        } 
    }
}

यह लौट आता है

[2=>['id'=>3,'cat'=>'normal']

के बजाय

[0=>['id'=>3,'cat'=>'normal']

इसका कारण यह है कि परेशान सरणी को फिर से अनुक्रमित नहीं करता है।

यह reindexes। (अगर हमें इसकी आवश्यकता है)

$result=[];
foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        $found=false;
        if($valueKey === 'cat' && $value === 'vip'){
            $found=true;
            $break;
        } 
        if(!$found) {
           $result[]=$element;
        }
    }
}

0

मैं बहुत php प्रोग्रामर नहीं हूँ, लेकिन मैं कह सकता हूँ कि C # में आप इसके माध्यम से पुनरावृत्ति करते हुए किसी सरणी को संशोधित नहीं कर सकते। आप तत्व के सूचकांक, या तत्वों को हटाने के लिए पहचानने के लिए अपने फ़ॉरेस्ट लूप का उपयोग करने की कोशिश कर सकते हैं, फिर लूप के बाद तत्वों को हटा दें।


14
जबकि यह अधिकांश भाषाओं में बुरा व्यवहार है, PHP में सरणियाँ मूल रूप से साहचर्य सरणियाँ हैं जिन्हें क्रम में पुनरावृत्त किया जा सकता है। पहले वाले तत्व को हटाने से उसके बाद आने वाले तत्वों की कुंजी नहीं बदल जाती है।
इग्नासियो वाज़केज़-अब्राम्स

22
दरअसल, इसकी अनुमति है क्योंकि आंतरिक रूप से फ़ॉरेक्स का उपयोग करने वाली सरणी मूल सरणी की एक प्रति है। इस तरह, मूल सरणी को संशोधित करना पूरी तरह से सुरक्षित है।
जुआन

68
वास्तव में, इसकी अनुमति है क्योंकि php सभी नरक के रूप में खराब है।
एरिक जी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.