মান অনুসারে অ্যারে আইটেমটি সরানো


166

আমার দেওয়া মান সহ অ্যারে আইটেমটি সরিয়ে ফেলতে হবে:

if (in_array($id, $items)) {
    $items = array_flip($items);
    unset($items[ $id ]);
    $items = array_flip($items);
}

এটি কি আরও কম (আরও দক্ষ) উপায়ে করা যেতে পারে?


উত্তর:


423

এটি একটি সাধারণ ওয়ান-লাইনার দিয়ে সম্পন্ন করা যায়।

এই অ্যারে থাকা:

$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');

আপনি করতে পারেন:

$arr = array_diff($arr, array('remove_me', 'remove_me_also'));

এবং এর মান $arrহবে:

array('nice_item', 'another_liked_item')

আশা করি এটি সুন্দর কোড লিখতে সহায়তা করবে।


2
না, এটা না রেফারেন্সড অ্যারে সঙ্গে কাজ, array_diffফাংশন অ ধ্বংসাত্মক যে এটা একটা নতুন বিন্যাস দেখায়।
আলেজান্দ্রো গার্সিয়া ইগলেসিয়াস

2
@ এসআরসিস্পাইডার কেন নয়? $referenced = array_diff($referenced, $items_to_remove);
আলেজান্দ্রো গার্সিয়া ইগলেসিয়াস

1
d রেফারেন্স এখন একটি নতুন অ্যারের দিকে ইঙ্গিত করছে, আপনি যে অ্যারেটি পরিবর্তন করতে চেয়েছিলেন তাতে এখনও পুরানো মান রয়েছে।
srcspider

2
@ এসসিআরস্পাইডার ভাল, আপনি আমাকে বলছেন যে এখানে এখানে কী চলছে ... কোডেপ্যাড.অর্গ
আলেজান্দ্রো গার্সিয়া ইগলেসিয়াস ২

1
আমার খারাপ; । পিএইচপি এর পরিবর্তনশীল এলিয়াসিং প্রতারণাপূর্ণ সবসময় আমার উপর ভ্রমণের>>
srcspider

37

আমি একটি দ্বিতীয় উত্তর যুক্ত করছি। আমি এখানে বিভিন্ন পদ্ধতি চেষ্টা করার জন্য একটি দ্রুত বেঞ্চমার্কিং স্ক্রিপ্ট লিখেছি।

$arr = array(0 => 123456);
for($i = 1; $i < 500000; $i++) {
    $arr[$i] = rand(0,PHP_INT_MAX);
}

shuffle($arr);
$arr2 = $arr;
$arr3 = $arr;

/** 
 * Method 1 - array_search()
 */
$start = microtime(true);
while(($key = array_search(123456,$arr)) !== false) {
    unset($arr[$key]);
}
echo count($arr). ' left, in '.(microtime(true) - $start).' seconds<BR>';

/** 
 * Method 2 - basic loop
 */
$start = microtime(true);
foreach($arr2 as $k => $v) {
    if ($v == 123456) {
        unset($arr2[$k]);
    }
}
echo count($arr2). 'left, in '.(microtime(true) - $start).' seconds<BR>';

/** 
 * Method 3 - array_keys() with search parameter
 */
$start = microtime(true);
$keys = array_keys($arr3,123456);
foreach($keys as $k) {
    unset($arr3[$k]);
}
echo count($arr3). 'left, in '.(microtime(true) - $start).' seconds<BR>';

array_keys()Specifiedচ্ছিক অনুসন্ধান প্যারামিটার নির্দিষ্ট করে তৃতীয় পদ্ধতিটি এখন পর্যন্ত সেরা পদ্ধতি বলে মনে হচ্ছে। আউটপুট উদাহরণ:

499999 left, in 0.090957164764404 seconds
499999left, in 0.43156313896179 seconds
499999left, in 0.028877019882202 seconds

এটি বিচার করে, আমি তখন যে সমাধানটি ব্যবহার করব তা হ'ল:

$keysToRemove = array_keys($items,$id);
foreach($keysToRemove as $k) {
    unset($items[$k]);
}

আমি মনে করি অ্যারে_ডিফ পদ্ধতিটি অ্যারে_ডিফ পদ্ধতিটি ব্যবহার করার চেয়ে অনেক বেশি পঠনযোগ্য কোড। উপভোট
কেন্দেপেলচিন

@ জম্বাট আমি ভাবছি ফলাফলের সাথে অর্ডারের কোনও সম্পর্ক আছে কিনা। এটা সম্ভব যে শিফলে আমরা যে মানটি অনুসন্ধান করছি সেটি সামনে বা শেষের কাছাকাছি রেখে দেওয়া সম্ভব। তা ছাড়া ... +1
জেনারেল রেডনেক

31

কেমন:

if (($key = array_search($id, $items)) !== false) unset($items[$key]);

বা একাধিক মানের জন্য:

while(($key = array_search($id, $items)) !== false) {
    unset($items[$key]);
}

এটি পাশাপাশি মূল ক্ষতি রোধ করতে পারে যা এর পার্শ্ব প্রতিক্রিয়া array_flip()


1
যদি আইডি প্রথম অ্যারে উপাদান হয় তবে এইভাবে কাজ করবে না: যদি (($ কী = অ্যারে_সার্চ ($ আইডি, $ আইটেম))! == মিথ্যা) আনসেট ($ আইটেম [$ কী]));
মারেক

15

মুছে ফেলার জন্য $rm_valথেকে$arr

unset($arr[array_search($rm_val, $arr)]);

8

সবচেয়ে শক্তিশালী সমাধানটি ব্যবহার করা হবে array_filter, যা আপনাকে নিজের ফিল্টারিং ফাংশনটি সংজ্ঞায়িত করতে দেয়।

তবে কেউ কেউ বলতে পারে এটি কিছুটা ওভারকিল, আপনার পরিস্থিতিতে ... অ্যারেটি গর্ত করতে গিয়ে যে জিনিসটি আপনি চান না তা সরানোর জন্য
একটি সরল foreachলুপ যথেষ্ট হওয়া উচিত।

আপনার ক্ষেত্রে এই জাতীয় কিছু সম্ভবত কৌশলটি করা উচিত:

foreach ($items as $key => $value) {
    if ($value == $id) {
        unset($items[$key]);
        // If you know you only have one line to remove, you can decomment the next line, to stop looping
        //break;
    }
}

6

অ্যারে_সার্চ চেষ্টা করুন ()


3
আমি কেবল ডকুমেন্টেশনটি পড়েছি এবং এটি মান সম্পর্কিত সমস্ত কীগুলি সন্ধান করতে অ্যারে_কিজ () ব্যবহার করার পরামর্শ দেয়।
সেভেজম্যান

@ সাভেজম্যান - একমত আমি একটি দ্রুত মানদণ্ড চালিয়েছি এবং এই কাজের array_keys()চেয়ে ভাল পারফরম্যান্সের array_search()জন্য মনে হচ্ছে ।
জম্বাট

6

আপনার সমাধানগুলি কেবল তখনই কাজ করে যদি আপনার অ্যারেতে অনন্য মান থাকে

দেখা:

<?php
$trans = array("a" => 1, "b" => 1, "c" => 2);
$trans = array_flip($trans);
print_r($trans);
?>

যদি প্রয়োজন হয় তবে একটি লুপে অ্যারে_সার্কের সাথে আরও ভাল উপায় আনসেট করা হবে ।


আপনি ঠিক বলেছেন, তবে এই বিশেষ ক্ষেত্রে আমি
মান্যতা

5

ডাব্লু / ও ফ্লিপ:

<?php
foreach ($items as $key => $value) {
    if ($id === $value) {
        unset($items[$key]);
    }
}


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