PHP: किसी सरणी से विशिष्ट तत्व कैसे निकालें?


160

जब मैं तत्वों के नाम को जानता हूं, तो किसी ऐरे से किसी तत्व को कैसे निकालूं? उदाहरण के लिए:

मेरे पास एक सरणी है:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

उपयोगकर्ता प्रवेश करता है strawberry

strawberry हटा दी है।

पूरी तरह से समझाने के लिए:

मेरे पास एक डेटाबेस है जो अल्पविराम द्वारा अलग की गई वस्तुओं की सूची संग्रहीत करता है। कोड उपयोगकर्ता की पसंद के आधार पर उस सूची में खींचता है जहां वह विकल्प स्थित है। इसलिए, यदि वे स्ट्रॉबेरी चुनते हैं, तो वे हर प्रविष्टि में कोड खींचते हैं स्ट्रॉबेरी स्थित है फिर विभाजन () का उपयोग करके एक सरणी में कनवर्ट करता है। मैं उन्हें उपयोगकर्ता द्वारा चुने गए आइटम निकालना चाहता हूं, इस उदाहरण के लिए, स्ट्रॉबेरी, सरणी से।



1
इसी तरह का एक और सवाल: stackoverflow.com/questions/1883421/…
एरिक लावोई

1
अधिक समान प्रश्न: stackoverflow.com/questions/369602/…
एलेक्स

जवाबों:


296

array_searchकुंजी पाने के लिए उपयोग करें और unsetयदि मिला तो इसे हटा दें :

if (($key = array_search('strawberry', $array)) !== false) {
    unset($array[$key]);
}

array_searchरिटर्न झूठी ( अशक्त पीएचपी 4.2.0 जब तक) अगर कोई आइटम पाया गया है।

और अगर एक ही मूल्य के साथ कई आइटम हो सकते हैं, तो आप array_keysसभी वस्तुओं की कुंजी प्राप्त करने के लिए उपयोग कर सकते हैं :

foreach (array_keys($array, 'strawberry') as $key) {
    unset($array[$key]);
}

एक अजीब परिणाम प्राप्त करना। मैंने आपके पहले सुझाव का उपयोग किया क्योंकि हमेशा केवल एक उदाहरण होगा। यह परीक्षण करने के लिए मैंने बस इसे महत्वपूर्ण मूल्य का उत्पादन किया था। काम किया। हालांकि, यह परेशान नहीं करेगा।
dcp3450

1
जबकि (odbc_fetch_row ($ runqueryGetSubmenus)) {$ submenuList = odbc_result ($ runqueryGetSubmenus, "submenus"); $ सबमेनूअरे = विभाजित (',', $ सबमेन्यूलिस्ट); अगर (($ key = array_search ($ नाम, $ submenuArray))! == झूठा) {unset ($ submenuArray [$ key]); }}
dcp3450

@ dcp3450: और आप क्या करते हैं $submenuArray? (ध्यान दें कि प्रत्येक लूप के साथ $submenuArrayओवरराइट किया जाएगा।)
गंबो

मैंने अपने प्रश्न को बेहतर ढंग से समझाने के लिए अद्यतन किया। मूल रूप से इस उदाहरण में चुने गए आइटम, "स्ट्रॉबेरी" को हटाने वाले डेटाबेस में प्रविष्टियों के माध्यम से कोड लूप होता है। तो, उपयोगकर्ता एक चयन में प्रवेश करता है => सबमेनस के तहत कोड खोजता है और किसी भी सूची को खोजता है जिसमें वह विकल्प होता है => उस सूची को एक सरणी में बदल देता है => चुने हुए विकल्प को हटाता है।
dcp3450

1
मैं समझ गया! मैं डीबी में नए ऐरे को दोबारा नहीं लिख रहा था। जब आप इतने लंबे समय के लिए कोड को घूरते हैं तो सामान को याद रखना आसान होता है।
dcp3450

153

array_diff()1 लाइन समाधान के लिए उपयोग करें :

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi', 'strawberry'); //throw in another 'strawberry' to demonstrate that it removes multiple instances of the string
$array_without_strawberries = array_diff($array, array('strawberry'));
print_r($array_without_strawberries);

... अतिरिक्त कार्यों या फॉरेक्स लूप की कोई आवश्यकता नहीं है।


8
यह समाधान शीर्ष लोगों की तुलना में अधिक सुपाठ्य है।
रोबर्ट

यद्यपि यदि strawberryप्रारंभिक सरणी में नहीं है, तो यह सरणी में उपलब्ध हो जाएगा $array_without_strawberries- खतरनाक कोड यदि आप यह सुनिश्चित करना चाहते हैं कि किसी दिए गए तत्व एक सरणी में नहीं है।
इरफान

5
@ इरफान आपका दावा गलत है। $a = array_diff(array(), array('strawberry'));- $ a एक खाली सरणी है।
21

1
आप सही हैं @bancer - मैं शायद array_intersect या कुछ और के बारे में सोच रहा था।
इरफान

1
array_diff () चिह्नित उत्तर की तुलना में अधिक सुरुचिपूर्ण है।
डोम डेफोनेट

36
if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}

2
यदि स्ट्रॉबेरी आपको सरणी में है तो आपको परीक्षण करना चाहिए ।
गुम्बो

एरे से हटाने से पहले तत्व के सत्यापन को शामिल करने के लिए गंबू की सलाह संशोधित उत्तर का पालन करें।
जॉन कोंडे

2
यह भी ध्यान रखें कि किसी विशेष तत्व को हटाने के बाद सूचकांक को पुनः प्राप्त नहीं किया जाता है। दूसरे शब्दों में, सूचकांक अनुक्रम अंतराल तो होगा। यदि आप अपने उदाहरण से 'स्ट्रॉबेरी' को हटाते हैं, तो 'कीवी' में अभी भी इंडेक्स 4 होगा, और इंडेक्स 2 बस गायब हो जाएगा। यह तब मायने रखता है जब आपका कोड सूचकांक अनुक्रम की पूर्णता पर निर्भर करता है, उदाहरण के लिए ($ i = 0; $ i <.., $ i ++) लूप करते हैं।
केला-राजा

2
केला-राजा ने जो कहा, उसे जोड़ने के लिए, यदि आप सरणी को फिर से जोड़ना चाहते हैं, तो बस करें $my_array = array_values($my_array);
रियुगी

2
जबकि यह समाधान सही है, यह TWICE ( in_arrayऔर array_search) सरणी को खोजता है । array_searchगम्बो के उत्तर में वापसी का उपयोग करना अधिक प्रभावी है
बोगदान डी

21

यदि आप यहां एक सादे सरणी का उपयोग कर रहे हैं (जो कि मामला जैसा लगता है), आपको इस कोड का उपयोग करना चाहिए:

if (($key = array_search('strawberry', $array)) !== false) {
    array_splice($array, $key, 1);
}

unset($array[$key]) केवल तत्व को हटाता है, लेकिन सादे सरणी को फिर से व्यवस्थित नहीं करता है।

मान लें कि हमारे पास एक सरणी है और array_splice का उपयोग करें:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
array_splice($array, 2, 1);
json_encode($array); 
// yields the array ['apple', 'orange', 'blueberry', 'kiwi']

परेशान करने की तुलना में:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[2]);
json_encode($array);
// yields an object {"0": "apple", "1": "orange", "3": "blueberry", "4": "kiwi"}

ध्यान दें कि कैसे unset($array[$key])सरणी को फिर से व्यवस्थित नहीं करता है।


आधिकारिक तौर unsetपर कुछ भी वापस नहीं करता है। तो json_encode(unset($array[2]))तुलना के लिए appropiate नहीं है।
रोज़बेक

यह वही है जिसकी मुझे आवश्यकता है, ericluwj को thaks
ana

12

आप किसी विशिष्ट स्थिति द्वारा आइटम को निकालने के लिए सरणी फ़िल्टर का उपयोग कर सकते हैं $v:

$arr = array_filter($arr, function($v){
    return $v != 'some_value';
});

Downvote। यह निम्न-गुणवत्ता (क्योंकि यह एक कोड-ओनली उत्तर है और एक पार्सिंग त्रुटि देता है) डी.मार्टिन की विधि का एक डुप्लिकेट है जो केवल एक अनाम फ़ंक्शन का उपयोग करता है array_filter()। हालांकि मैं व्यक्तिगत रूप से अपने कार्यान्वयन में एक अनाम फ़ंक्शन का उपयोग कर रहा हूं, मेरा मानना ​​है कि SO पर सही कार्रवाई डी। मर्टिन के जवाब पर टिप्पणी करना या संपादित करना होगा यदि आप सूक्ष्म सुधार करना चाहते हैं ताकि यह पृष्ठ फूला हुआ न हो। कृपया इस डुप्लिकेट उत्तर को हटा दें।
मिकमैकुसा

4

इस तरह होगा:

 function rmv_val($var)
 {
     return(!($var == 'strawberry'));
 }

 $array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

 $array_res = array_filter($array, "rmv_val");

4

यह एक सरल पुनर्मूल्यांकन है जो सरणी में कई मानों को हटा सकता है।

    // Your array
    $list = array("apple", "orange", "strawberry", "lemon", "banana");

    // Initilize what to delete
    $delete_val = array("orange", "lemon", "banana");

    // Search for the array key and unset   
    foreach($delete_val as $key){
        $keyToDelete = array_search($key, $list);
        unset($list[$keyToDelete]);
    }

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

4

यू सिर्फ सिंगल लाइन कर सकता है। यह ऐरे से एलिमेंट हटा देगा


$array=array_diff($array,['strawberry']);


3

मैं वर्तमान में इस फ़ंक्शन का उपयोग कर रहा हूं:

function array_delete($del_val, $array) {
    if(is_array($del_val)) {
         foreach ($del_val as $del_key => $del_value) {
            foreach ($array as $key => $value){
                if ($value == $del_value) {
                    unset($array[$key]);
                }
            }
        }
    } else {
        foreach ($array as $key => $value){
            if ($value == $del_val) {
                unset($array[$key]);
            }
        }
    }
    return array_values($array);
}

आप किसी सरणी या केवल स्ट्रिंग को तत्व (एस) के साथ इनपुट कर सकते हैं जिसे हटा दिया जाना चाहिए। इसे इस तरह लिखें:

$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$detils = array_delete(array('orange', 'apple'), $detils);

या

$detils = array_delete('orange', $detils);

यह भी इसे reindex करेंगे।


2
यह बुरी तरह से जटिल और ढलान वाला है। यह 3 लाभ कैसे हुआ?
मिकमैकुसा

2

इस प्रश्न के कई उत्तर हैं, लेकिन मैं कुछ और जोड़ना चाहता हूं क्योंकि जब मैंने उपयोग किया था unsetया array_diffमुझे नए सरणी के अनुक्रमित के साथ खेलने के लिए कई समस्याएं थीं, जब विशिष्ट तत्व को हटा दिया गया था (क्योंकि प्रारंभिक सूचकांक सहेजे गए हैं)

मैं उदाहरण के लिए वापस आ गया:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$array_without_strawberries = array_diff($array, array('strawberry'));

या

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[array_search('strawberry', $array)]);

यदि आप उस परिणाम को प्रिंट करते हैं जो आप प्राप्त करेंगे:

foreach ($array_without_strawberries as $data) {
   print_r($data);
}

परिणाम :

> apple
> orange
> blueberry
> kiwi

लेकिन अनुक्रमित सहेजे जाएंगे और इसलिए आप अपने तत्व तक पहुंचेंगे जैसे:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[3] > blueberry
$array_without_strawberries[4] > kiwi

और इसलिए अंतिम सरणी पुन: अनुक्रमित नहीं होती हैं। तो आपको unsetया के बाद जोड़ना होगा array_diff:

$array_without_strawberries = array_values($array);

उसके बाद आपके सरणी में एक सामान्य सूचकांक होगा:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[2] > blueberry
$array_without_strawberries[3] > kiwi

इस पोस्ट से संबंधित: री-इंडेक्स ऐरे

यहां छवि विवरण दर्ज करें

आशा है कि यह मदद करेगा


1

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


1
आपकी पोस्ट एक टिप्पणी है एक उत्तर नहीं। कृपया प्रश्न के अंतर्गत हटाएं और पोस्ट करें।
मिकमैकुसा

1

Https://stackoverflow.com/users/924109/rok.kkj द्वारा दिए गए मूल्य (महत्वपूर्ण नहीं) द्वारा PHP सरणी हटाने का उत्तर

IMO सबसे अच्छा उत्तर है क्योंकि यह हटाता है और उत्परिवर्तित नहीं करता है

array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]

यह अच्छी तरह से सामान्यीकृत करता है, आप चाहें तो एक ही समय में जितने चाहें उतने तत्व निकाल सकते हैं।

अस्वीकरण: ध्यान दें कि मेरा हल पुराने उत्तर को स्वीकार किए गए उत्तर के विपरीत बरकरार रखते हुए सरणी की एक नई प्रति तैयार करता है। इसकी वजह से यह थोड़ा धीमा हो सकता है।


1

मैं उसी प्रश्न के उत्तर की तलाश में था और इस विषय पर आया था। के संयोजन: मैं दो मुख्य तरीके को देखने array_searchऔर unsetऔर के उपयोग array_diff। पहली नज़र में, यह मुझे लग रहा था कि पहली विधि और तेज़ होगी, क्योंकि अतिरिक्त सरणी के निर्माण की आवश्यकता नहीं है (जैसा कि उपयोग करते समय)array_diff )। लेकिन मैंने एक छोटा बेंचमार्क लिखा और सुनिश्चित किया कि दूसरी विधि न केवल अधिक संक्षिप्त है, बल्कि तेज भी है! खुशी है कि आप के साथ यह साझा करने के लिए। :)

https://glot.io/snippets/f6ow6biaol


0

मैं सरणी में कुंजियों की खोज करने के लिए array_key_exists का उपयोग करना पसंद करूंगा :

Array([0]=>'A',[1]=>'B',['key'=>'value'])

निर्दिष्ट प्रभावी ढंग से खोजने के लिए, चूंकि array_search और in_array () यहां काम नहीं करते हैं। और असंतुष्ट के साथ सामान हटाना ()

मुझे लगता है कि यह किसी की मदद करेगा।


0

विशेष ऐरे मूल्य को हटाने के साथ संख्यात्मक सरणी बनाएँ

    <?php
    // create a "numeric" array
    $animals = array('monitor', 'cpu', 'mouse', 'ram', 'wifi', 'usb', 'pendrive');

    //Normarl display
    print_r($animals);
    echo "<br/><br/>";

    //If splice the array
    //array_splice($animals, 2, 2);
    unset($animals[3]); // you can unset the particular value
    print_r($animals);

    ?>

आप इस लिंक को देख सकते हैं।


Downvote। प्रश्न स्पष्ट रूप से मूल्य के आधार पर एक मूल्य को हटाने के लिए कहता है (कुंजी नहीं)। यह उत्तर बेकार है, कृपया हटाएं।
मिकमैकुसा

0
$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) {
        if ($value!=$remove) {
        echo $value.'<br/>';
                continue;
        }
}

यह उत्तर आवश्यक विकल्प को भी नहीं हटाता है।
निगेल रेन

-1

उपयोग करना array_seach(), निम्नलिखित प्रयास करें:

if(($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
}

array_search()उस तत्व की कुंजी देता है, जिसे वह खोजता है, जिसका उपयोग करके उस तत्व को मूल सरणी से हटाया जा सकता है unset()। यह FALSEअसफलता पर लौटेगा , हालांकि यह सफलता पर "गलत" मान लौटा सकता है (आपकी कुंजी 0उदाहरण के लिए हो सकती है), जो कि तुलनात्मक तुलना है!== ऑपरेटर का उपयोग किया जाता है।

if()के विवरण की जांच करेंगे कि क्या array_search()एक मान दिया है, और अगर यह किया केवल एक कार्रवाई प्रदर्शन करेंगे।


3
Downvote। यह गुम्बो की पद्धति (वर्तमान में स्वीकृत समाधान) का एक डुप्लिकेट है जो आपके द्वारा सालों पहले पोस्ट किया गया था। डुप्लिकेट उत्तरों का कोई मूल्य नहीं है और केवल अनावश्यक पृष्ठ ब्लोट का कारण बनता है। कृपया अपना उत्तर हटा दें। यदि आप गुम्बो के उत्तर की व्याख्या करना चाहते हैं, तो उसके उत्तर पर एक संपादन के साथ करें या
गुम्बो को

-1
unset($array[array_search('strawberry', $array)]);

2
Downvote। array_search()- unset()पद्धति पहले से ही तुम्हारा से पहले जॉन कोंडे साल से तैनात थे। डुप्लिकेट उत्तरों का पाठकों के लिए कोई मूल्य नहीं है और वास्तव में अनावश्यक जानकारी को स्क्रॉल करते और पढ़ते समय बर्बाद होने के कारण असुविधा होती है। कृपया इस उत्तर को हटा दें।
मिकमैकुसा

-1
<?php 
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>

2
आप इस उत्तर को एक वाक्य या दो के बारे में लिखकर सुधार सकते हैं क) कोड क्या करता है, और ख) आपको क्यों लगता है कि यह अन्य सभी उत्तरों में से एक विकल्प है।
रोबिन मैकेंज़ी

-1
foreach ($get_dept as $key5 => $dept_value) {
                if ($request->role_id == 5 || $request->role_id == 6){
                    array_splice($get_dept, $key5, 1);
                }
            }

4
आपके द्वारा प्रदान किए गए उत्तर के अलावा, कृपया इस बात की संक्षिप्त व्याख्या प्रदान करें कि यह समस्या क्यों और कैसे ठीक होती है।
13:15 पर jtate

-2
$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
     function remove_embpty($values)
     {
        if($values=='orange')
        {
            $values='any name';
        }
        return $values;
     }
     $detils=array_map('remove_embpty',$detils);
    print_r($detils);

2
कृपया स्पष्टीकरण भी जोड़ें। यह समस्या का समाधान कैसे करता है।
राहिल वज़ीर

आपका उत्तर किसी तत्व को हटाने के लिए सरणी के एक तत्व को दूसरे NO में बदल देता है
ahmed hamdy

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