আপনি কীভাবে একটি অগ্রণী লুপে একটি অ্যারের উপাদানটি সরিয়ে ফেলবেন?


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]);
    }
}


5
নোট করুন যে আনসেট করা আইটেমগুলির সাথে সূচিযুক্ত অ্যারেগুলি এ এর ​​পরে অ্যারের পরিবর্তে অবজেক্ট হিসাবে উপস্থাপিত হতে পারে json_encode()। লুপ $display_related_tags = array_values ($display_related_tags);পরে আপনি এটি সমাধান করতে পারেন foreach
মার্টন ট্যামস

নোটের এখানে কৌশলটি ফোরচ লুপে একটি মান যুক্ত করা উচিত ;-)
মিঃ ওয়াশিংটন

5
দয়া করে @ নীলের উত্তর দেখুন। আপনি অপ্রত্যাশিত বাগগুলির মুখোমুখি হবেন, বিশেষত যদি আপনি স্টাডক্ল্যাসের অ্যারে নিয়ে কাজ করেন। আপনি কি অপ্রত্যাশিত আচরণ পছন্দ করেন? আমি না.
হ্যাপি_মারমোসেট

@ হ্যাপি_মারমোসেট নীল উত্তরগুলি সাহায্য করছে না। স্নিপেট $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'];
    });

পিএইচপি ডকুমেন্টেশন যেমন পড়ে:

যেমন foreach পিএইচপি 5 এর অভ্যন্তরীণ অ্যারে পয়েন্টারের উপর নির্ভর করে, লুপের মধ্যে এটি পরিবর্তন করা অপ্রত্যাশিত আচরণের দিকে পরিচালিত করতে পারে।

পিএইচপি 7-তে, পূর্বাঞ্চটি অভ্যন্তরীণ অ্যারে পয়েন্টার ব্যবহার করে না।


নোট করুন যে এখানে $ ই হিসাবে কীটি পাস করার জন্য তৃতীয় প্যারামিটারটি ARRAY_FILTER_USE_KEY হওয়া উচিত।
নেমজারো

@namezero ঠিক আছে কেন এখানে ব্যাপার?
অ্যাব্রাকাডাভ

@ অ্যাব্রাকাডাওয়ার ডকুমেন্টেশন থেকে ( 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. এটি বলেছে, অবশ্যই এই ক্ষেত্রে উত্তরটি পুনরায় পড়া আপনার দাবির মতো বিষয় নয়।
নেমজারো

গুরুত্বপূর্ণ আপনি যদি আদেশটিকে অ্যারে হিসাবে অ্যারে রাখতে আগ্রহী হন তবে আপনাকে 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
'লিঙ্কমুক্ত' ফাইলগুলি লিঙ্কমুক্ত করে, ভেরিয়েবলগুলির সাথে বা বিশেষত অ্যারেগুলির সাথে এর কোনও যোগসূত্র নেই। সম্ভবত আপনি 'আনসেট' বলতে চাইছেন?
amn

6

অ্যারেতে ফোরচ () লুপ না করে, সঠিক কীটি খুঁজে পেতে অ্যারে_সার্চ () ব্যবহার করা আরও দ্রুত হবে। ছোট অ্যারেগুলিতে, আমি আরও ভাল পাঠযোগ্যতার জন্য ভবিষ্যদ্বাণী নিয়ে যাব, তবে বড় অ্যারে, বা প্রায়শই সম্পাদিত কোডের জন্য, এটি কিছুটা অনুকূল হতে হবে:

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

কঠোর তুলনা অপারেটর! == প্রয়োজন, কারণ অ্যারে_সার্চ () অবাঞ্ছিতভ্যালুয়ের সূচক হিসাবে 0 ফিরিয়ে দিতে পারে।

এছাড়াও, উপরের উদাহরণটি কেবলমাত্র প্রথম মানটি $ অযাচিত ওয়ালিউটিকে সরিয়ে ফেলবে, যদি $ অ্যারেতে $ অযাচিত ওয়ালুয়ল আরও একবার দেখা যায় তবে সেগুলি সন্ধানের জন্য আপনার অ্যারে_কিগুলি () ব্যবহার করা উচিত:

$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

যেমনটি ইতিমধ্যে উল্লেখ করা হয়েছে, আপনি কীটি দিয়ে একটি ভবিষ্যতবাণী করতে চান এবং কীটি ব্যবহার করে আনসেট করতে চান - তবে মনে রাখবেন যে পুনরাবৃত্তির সময় একটি অ্যারের পরিবর্তন করা সাধারণভাবে একটি খারাপ ধারণা, যদিও আমি এই বিষয়ে পিএইচপি-র বিধি সম্পর্কে নিশ্চিত নই। চট করে।


2
কোনও পিএইচপি ফোরচ পূর্ব নির্বিশেষে পুরো অ্যারেতে কার্যকর করা হবে। পুনরাবৃত্তির পরবর্তী যে মানটি সেট না করে পরীক্ষা করুন। এটি অফসেটে পুনরাবৃত্তি হবে তবে মানটি শূন্য হবে।
কেভিন পেনো

যদি আপনি পুনরাবৃত্তির সময় কোনও অ্যারেটি পরিবর্তন না করেন তবে কীভাবে কোনও অ্যারেটিকে মিউটেট করবেন? সাধারণভাবে পুনরাবৃত্তির পরিবর্তে গড় foreachবা forনির্মাণ হতে পারে ?
গেরম্যান

এটি নিজের এবং নিজের উত্তর চেয়ে অন্য উত্তরের একটি মন্তব্য।
Sinister দাড়ি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.