आप फ़ॉरेस्ट लूप में एक सरणी तत्व कैसे निकालते हैं?


127

foreachयदि कोई मान मौजूद है तो मैं एक सरणी के माध्यम से लूप करना चाहता हूं । यदि मान मौजूद है, तो मैं उस तत्व को हटाना चाहता हूं जिसमें यह शामिल है।

मेरे पास निम्नलिखित कोड हैं:

foreach($display_related_tags as $tag_name) {
    if($tag_name == $found_tag['name']) {
        // Delete element
    }
}

मुझे पता नहीं है कि मूल्य मिलते ही तत्व को कैसे हटाया जाए। मैं इसे कैसे हटाऊं?

मुझे foreachइस समस्या के लिए उपयोग करना है। संभवतः इसके विकल्प हैं foreach, और आप उन्हें साझा करने के लिए स्वागत करते हैं।

जवाबों:


220

यदि आपको चाबी मिलती है, तो आप उस आइटम को इस तरह से हटा सकते हैं:

foreach ($display_related_tags as $key => $tag_name) {
    if($tag_name == $found_tag['name']) {
        unset($display_related_tags[$key]);
    }
}

3
का उपयोग करके बेहतर बनाने के बारे कुछ अतिरिक्त जानकारी $key => &$tag_name stackoverflow.com/a/2008893/922522
जस्टिन

5
ध्यान दें कि किसी आइटम के साथ अनुक्रमित सरणियों को एक के बाद सरणियों के बजाय ऑब्जेक्ट के रूप में दर्शाया जा सकता है json_encode()। आप इसे लूप के $display_related_tags = array_values ($display_related_tags);बाद हल कर सकते हैं foreach
मॉर्टन तमेस

ध्यान दें कि यहां ट्रिक है कि फॉर्च्यून लूप में एक वैल्यू ऐड किया जाए ;-)
मिस्टर वाशिंगटन

5
कृपया @Neils उत्तर देखें। आप अप्रत्याशित बग का सामना करेंगे, खासकर अगर आप stdClasses के ऐरे के साथ काम करते हैं। क्या आपको अप्रत्याशित व्यवहार पसंद है? मैं नही।
Happy_marmoset

@happy_marmoset नील का जवाब मदद नहीं कर रहा है। स्निपेट $projects = array_filter($projects, function ($project) { return count($project->roles) > 0; });यह परिणाम को वस्तु में परिवर्तित करता है।
परितोष

36

एक बेहतर समाधान array_filterफ़ंक्शन का उपयोग करना है:

$display_related_tags =
    array_filter($display_related_tags, function($e) use($found_tag){
        return $e != $found_tag['name'];
    });

जैसा कि php प्रलेखन पढ़ता है:

जैसा कि foreach PHP 5 में आंतरिक सरणी सूचक पर निर्भर करता है, इसे लूप के भीतर बदलने से अप्रत्याशित व्यवहार हो सकता है।

PHP 7 में, foreach आंतरिक सरणी पॉइंटर का उपयोग नहीं करता है।


ध्यान दें कि कुंजी को $ e के रूप में पास करने के लिए 3rd पैरामीटर ARRAY_FILTER_USE_KEY होना चाहिए।
namezero

@namezero ठीक है, यहाँ वह बात क्यों है?
AbraCadaver

@AbraCadaver दस्तावेज़ीकरण से ( php.net/manual/en/function.array-filter.php ): ARRAY_FILTER_USE_KEY - pass key as the only argument to callback instead of the value ARRAY_FILTER_USE_BOTH - pass both value and key as arguments to callback instead of the value Default is 0 which will pass value as the only argument to callback instead. कहा कि इस मामले में फिर से जवाब पढ़ना निश्चित रूप से आपके द्वारा दावा किए जाने से कोई फर्क नहीं पड़ेगा।
namezero

महत्वपूर्ण यदि आप सरणी को क्रमबद्ध सरणी के रूप में रखने में रुचि रखते हैं, तो आपको display_related_tags = array_values(display_related_tags);इसके बाद कॉल करने की आवश्यकता है।
मंगलनी

9
foreach($display_related_tags as $key => $tag_name)
{
    if($tag_name == $found_tag['name'])
        unset($display_related_tags[$key];
}

3
'अनलिंक' फाइलों को अनलिंक करता है, इसका चर या, विशेष रूप से, सरणियों से कोई लेना-देना नहीं है। शायद आपका मतलब 'परेशान' है?
एमएन

6

सरणी पर फ़ॉरच () लूप करने के बजाय उचित कुंजी खोजने के लिए array_search () का उपयोग करना तेज़ होगा। छोटे एरेज़ पर, मैं बेहतर पठनीयता के लिए फ़ॉरचेक के साथ जाऊंगा, लेकिन बड़े एरेज़ या अक्सर निष्पादित कोड के लिए, यह थोड़ा अधिक इष्टतम होना चाहिए:

$result=array_search($unwantedValue,$array,true);
if($result !== false) {
  unset($array[$result]);   
}

सख्त कंप्रेशर ऑपरेटर! == की आवश्यकता है, क्योंकि array_search () 0 $ अवांछित डॉलर के सूचकांक के रूप में वापस आ सकता है।

इसके अलावा, उपरोक्त उदाहरण सिर्फ पहले मूल्य $ अनचाहे विल को हटा देगा, अगर $ अवांछितवैल्यू अधिक हो सकती है तो एक बार $ सरणी में, आपको उन सभी को खोजने के लिए array_keys () का उपयोग करना चाहिए:

$result=array_keys($array,$unwantedValue,true)
foreach($result as $key) {
  unset($array[$key]);
}

चेक http://php.net/manual/en/function.array-search.php अधिक जानकारी के लिए।


0

यदि आपके पास ऐसा परिदृश्य है जिसमें आपको अधिक हटाना है, तो इस मामले में फ़ॉरेस्ट सरणी से एक मान आपको प्रत्येक के लिए संदर्भ द्वारा मान पास करना होगा: मैं इस परिदृश्य को समझाने का प्रयास करता हूं:

foreach ($manSkuQty as $man_sku => &$man_qty) {

               foreach ($manufacturerSkus as $key1 => $val1) {

  // some processing here and unset first loops entries                     
 //  here dont include again for next iterations
                           if(some condition)
                            unset($manSkuQty[$key1]);

                        }
               }
}

दूसरे लूप में आप पहले लूप की प्रविष्टियों को अनसेट करना चाहते हैं न ही प्रदर्शन उद्देश्य के लिए पुन: पुनरावृति में आएँ या फिर फिर मेमोरी से परेशान हों क्योंकि स्मृति में वे मौजूद हैं और पुनरावृत्तियों में आएंगे।


0

पहले से ही उत्तर हैं जो कैसे परेशान करने के लिए प्रकाश दे रहे हैं। अपनी सभी कक्षाओं में कोड दोहराने के बजाय नीचे दिए गए प्रकार्य बनाएं और जब भी आवश्यकता हो कोड में इसका उपयोग करें। व्यावसायिक तर्क में, कभी-कभी आप कुछ गुणों को उजागर नहीं करना चाहते हैं। कृपया नीचे एक लाइनर कॉल को हटाने के लिए देखें

public static function removeKeysFromAssociativeArray($associativeArray, $keysToUnset)
{
    if (empty($associativeArray) || empty($keysToUnset))
        return array();

    foreach ($associativeArray as $key => $arr) {
        if (!is_array($arr)) {
            continue;
        }

        foreach ($keysToUnset as $keyToUnset) {
            if (array_key_exists($keyToUnset, $arr)) {
                unset($arr[$keyToUnset]);
            }
        }
        $associativeArray[$key] = $arr;
    }
    return $associativeArray;
}

जैसे कॉल करें:

removeKeysFromAssociativeArray($arrValues, $keysToRemove);

-1

जैसा कि पहले ही उल्लेख किया गया है, आप कुंजी के साथ एक फॉर्च करना चाहते हैं, और कुंजी का उपयोग करके परेशान हो जाएंगे - लेकिन ध्यान दें कि पुनरावृत्ति के दौरान एक सरणी को बदलना सामान्य रूप से एक बुरा विचार है, हालांकि मुझे इस पर PHP के नियमों पर यकीन नहीं है बेतकल्लुफ़।


2
एक php foreach पूरी सरणी पर ध्यान दिए बिना कार्य करेगा। पुनरावृति के बाद एक मान का परीक्षण करना। यह ऑफसेट पर पुनरावृति करेगा, लेकिन मूल्य शून्य होगा।
केविन पेनो

यदि आप पुनरावृत्ति के दौरान किसी सरणी को म्यूट नहीं करते हैं, तो किसी सरणी को कैसे उत्परिवर्तित करते हैं? सामान्य रूप से पुनरावृत्ति के बजाय माध्य foreachया forनिर्माण हो सकते हैं ?
घूमर

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