ফোরচ লুপের ভিতরে অ্যারে থেকে অবজেক্টটি কীভাবে মুছবেন?


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
        } 
    }
}

কোনও পরামর্শ. ধন্যবাদ।


উত্তর:


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.net/manual/en/control-structures.foreach.php#88578
প্যাংগন

1
@ পরিতোষ আমি জানি আপনি এটি পোস্ট করেছেন অনেক আগে, কিন্তু এটি কারণ পিএইচপি সহযোগী অ্যারে ব্যবহার করে। সুতরাং আপনার মুছে ফেলা একটি সূচক রয়েছে: এবং এটি একটি বিষয় হিসাবে JSON এ এনকোড হচ্ছে। অর্থবোধ তৈরি করে, যেহেতু একটি সহযোগী অ্যারে হ'ল "অভিধান"। যে কেউ আসছেন তাকে সহায়তা করতে পারে।
রায়ান ও'ডনেল

1
আপনি কি সত্যিই প্রতিটি জন্য দ্বিতীয় করা প্রয়োজন? আপনি কি কেবলমাত্র বস্তুর পছন্দসই 'আইডি' সম্পত্তিটি জিজ্ঞাসা করতে পারবেন না? অন্যান্য প্রপসগুলি কেন পরীক্ষা করে দেখুন।
htafoya

3
@htafoya না আপনি ঠিক কি করতে পারেন তা if(isset($element['id']) && $element['id'] == 'searched_value') { unset($array[$elementKey]); }আমি ঠিক কীভাবে তার কোডটি অনুলিপি করে সংশোধন করেছিলাম কীভাবে তাকে unsetসঠিকভাবে দেখাতে হবে ।
প্রোডিজিটালসন

2

দেখে মনে হচ্ছে আনসেটের জন্য আপনার বাক্য গঠনটি অবৈধ এবং পুনর্নির্মাণের অভাব ভবিষ্যতে সমস্যার কারণ হতে পারে। দেখুন: পিএইচপি অ্যারেতে বিভাগটি

সঠিক বাক্য গঠন উপরে দেখানো হয়েছে। এছাড়াও মনে রাখা অ্যারের-মান , reindexing জন্য যাতে আপনি কখনও সূচক কিছু পূর্বে মুছে না।


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
@ দেভ_নিক্স $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']

কারণ আনসেটটি অ্যারেটিকে পুনরায় সূচি দেয় না।

এটি পুনর্নির্মাণ করে। (যদি আমাদের এটি প্রয়োজন হয়)

$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

আমি খুব বেশি পিএইচপি প্রোগ্রামার নই, তবে আমি বলতে পারি যে সি # তে আপনি এটির মাধ্যমে পুনরাবৃত্তি করার সময় কোনও অ্যারে পরিবর্তন করতে পারবেন না। আপনি উপাদানটির সূচক বা উপাদানগুলি সরিয়ে ফেলার জন্য, তারপরে লুপের পরে উপাদানগুলি মুছতে আপনার ফোরচ লুপটি ব্যবহার করতে চেষ্টা করতে পারেন।


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

22
প্রকৃতপক্ষে, এটি অনুমোদিত কারণ পূর্ববর্তী অভ্যন্তরীণভাবে ব্যবহৃত অ্যারেটি মূল অ্যারের অনুলিপি। এইভাবে, মূল অ্যারেটি পরিবর্তন করা পুরোপুরি নিরাপদ।
জুয়ান

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