PHP साहचर्य सरणी से तत्वों को निकालें


100

मेरा एक PHP सरणी है जो कुछ इस तरह दिखता है:

Index              Key     Value
[0]                1       Awaiting for Confirmation
[1]                2       Assigned
[2]                3       In Progress
[3]                4       Completed
[4]                5       Mark As Spam

जब मैं इसे पाने के लिए सरणी मानों को var_dump करता हूं:

array(5) { [0]=> array(2) { ["key"]=> string(1) "1" ["value"]=> string(25) "Awaiting for Confirmation" } [1]=> array(2) { ["key"]=> string(1) "2" ["value"]=> string(9) "Assigned" } [2]=> array(2) { ["key"]=> string(1) "3" ["value"]=> string(11) "In Progress" } [3]=> array(2) { ["key"]=> string(1) "4" ["value"]=> string(9) "Completed" } [4]=> array(2) { ["key"]=> string(1) "5" ["value"]=> string(12) "Mark As Spam" } }

मैं कम्प्लीट और मार्क अस स्पैम को हटाना चाहता था । मुझे पता है कि मैं कर सकता हूं unset[$array[3],$array[4]), लेकिन समस्या यह है कि कभी-कभी सूचकांक संख्या अलग हो सकती है।

क्या मुख्य मूल्य के बजाय मूल्य नाम से मिलान करके उन्हें हटाने का कोई तरीका है?


यकीन नहीं है कि मैं यहाँ हाथ में सवाल समझ सकता हूँ? आपका क्या मतलब है कि कभी-कभी सूचकांक संख्या अलग हो सकती है?
साइमन एच।

जवाबों:


153

आपका सरणी काफी अजीब है: क्यों न केवल keyसूचकांक, और के valueरूप में ... मान का उपयोग करें?

यदि आपका सरणी इस तरह घोषित किया गया तो यह बहुत आसान नहीं होगा:

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);

कि आप keyसरणी का उपयोग करने के लिए अनुक्रमित के रूप में अपने मूल्यों का उपयोग करने की अनुमति देगा ...

और आप मानों पर खोज करने के लिए फ़ंक्शंस का उपयोग करने में सक्षम होंगे, जैसे array_search():

$indexCompleted = array_search('Completed', $array);
unset($array[$indexCompleted]);

$indexSpam = array_search('Mark As Spam', $array);
unset($array[$indexSpam]);

var_dump($array);

अपने सरणी के साथ की तुलना में आसान है, नहीं?



इसके बजाय, आपके सरणी जो इस तरह दिखता है:

$array = array(
    array('key' => 1, 'value' => 'Awaiting for Confirmation'), 
    array('key' => 2, 'value' => 'Asssigned'), 
    array('key' => 3, 'value' => 'In Progress'), 
    array('key' => 4, 'value' => 'Completed'), 
    array('key' => 5, 'value' => 'Mark As Spam'), 
);

विश्लेषण करने के लिए valueऔर सही वस्तुओं को अनसेट करने के लिए आपको सभी वस्तुओं पर लूप करना होगा:

foreach ($array as $index => $data) {
    if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') {
        unset($array[$index]);
    }
}
var_dump($array);

यहां तक ​​कि अगर सक्षम है, तो यह इतना आसान नहीं है ... और मैं जोर देता हूं: क्या आप एक सरल कुंजी / मूल्य प्रणाली के साथ काम करने के लिए अपने सरणी के प्रारूप को नहीं बदल सकते हैं?


"आपको मूल्य का विश्लेषण करने के लिए सभी वस्तुओं पर लूप करना होगा"। जब आप array_search का उपयोग कर रहे हैं तो आप सभी आइटमों के माध्यम से भी खोज सकते हैं।
निकोलस आओकी

96
  ...

  $array = array(
      1 => 'Awaiting for Confirmation', 
      2 => 'Asssigned', 
      3 => 'In Progress', 
      4 => 'Completed', 
      5 => 'Mark As Spam', 
  );



  return array_values($array);
  ...

3
धन्यवाद, मैं केवल इस के लिए देख रहा था। :)
रवि धोरिया

2
अच्छा और आसान । बस इसके लिए देख रहे हैं
फैसल महमूद अवन

यह सही उत्तर है, न कि जाँच की गई थी।
A.Seddighi

16
$key = array_search("Mark As Spam", $array);
unset($array[$key]);

2D सरणियों के लिए ...

$remove = array("Mark As Spam", "Completed");
foreach($arrays as $array){
    foreach($array as $key => $value){
        if(in_array($value, $remove)) unset($array[$key]);
    }
}


3

Array_diff का उपयोग क्यों नहीं करते हैं?

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);
$to_delete = array('Completed', 'Mark As Spam');
$array = array_diff($array, $to_delete);

बस ध्यान दें कि आपके सरणी को फिर से जोड़ा जाएगा।


1

इसे इस्तेमाल करे:

$keys = array_keys($array, "Completed");

/ संपादित करें जैसा कि जॉनपी ने उल्लेख किया है, यह विधि केवल गैर-नेस्टेड सरणियों के लिए काम करती है।


0

अपने नेस्टेड लक्ष्य सरणी को लेने के लिए ऐसा करने का तरीका और एकल चरण में इसे गैर-नेस्टेड सरणी में कॉपी करें। कुंजी (एस) को हटा दें और फिर अंतिम ट्रिम किए गए सरणी को पहले के सरणी के नेस्टेड नोड को असाइन करें। यह सरल बनाने के लिए एक कोड है:

$temp_array = $list['resultset'][0];

unset($temp_array['badkey1']);
unset($temp_array['badkey2']);

$list['resultset'][0] = $temp_array;

0

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

यह मानते हुए कि सरणी बहुत बड़ी नहीं है, मैं array_filter का उपयोग करूंगा। यह सरणी की एक प्रति बनाएगा, जो रिकॉर्ड आप निकालना चाहते हैं उसे घटाकर, जिसे आप मूल सरणी चर पर वापस असाइन कर सकते हैं।

यद्यपि यह अक्षम लग सकता है लेकिन यह वास्तव में बहुत प्रचलन में है इन दिनों चर अपरिवर्तनीय है, और तथ्य यह है कि अधिकांश php सरणी फ़ंक्शंस मूल सरणी के साथ फ्यूजनिंग के बजाय एक नया सरणी लौटाते हैं जो PHP थोड़े आपको भी ऐसा करना चाहता है। और जितना अधिक आप सरणियों के साथ काम करते हैं, और महसूस करते हैं कि अनसेट () फ़ंक्शन कितना कठिन और कष्टप्रद है, यह दृष्टिकोण बहुत मायने रखता है।

वैसे भी:

$my_array = array_filter($my_array, 
                         function($el) { 
                            return $el["value"]!="Completed" && $el!["value"]!="Marked as Spam"; 
                         });

एम्बेडेड फ़ंक्शन में आप जो भी समावेश तर्क (जैसे। आपकी आईडी फ़ील्ड) का उपयोग कर सकते हैं।


-1

एकल सरणी के लिए आइटम का उपयोग करें reset($item)


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