2009-12-10 16 views
143

मैं दिए गए मूल्य के साथ सरणी आइटम हटाने की जरूरत द्वारा सरणी आइटम निकाला जा रहा?मूल्य

+1

संभावित डुप्लिकेट [पीएचपी सरणी मान से हटाना (कुंजी नहीं)] (http://stackoverflow.com/questions/7225070/php-array-delete-by-value-not-key) – Ben

उत्तर

384

यह एक सरल एक लाइनर के साथ पूरा किया जा सकता है।

$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') 

आशा है कि यह सुंदर कोड लिखने में मदद करता है

इस सरणी होने।

+0

केवल तभी जब आप चर का नियंत्रण करते हैं। यदि आप इसे संदर्भ के रूप में प्राप्त करते हैं तो यह विधि अनुपयोगी है। – srcspider

+1

नहीं, यह * संदर्भित सरणी के साथ काम करता है, 'array_diff' फ़ंक्शन गैर-विनाशकारी है, यह एक नई सरणी देता है। –

+0

यदि आप संदर्भ के द्वारा एक सरणी प्राप्त करते हैं और इससे किसी आइटम को हटाना चाहते हैं, तो आप मेरे बिंदु को याद करते हैं, आप इस विधि से नहीं कर सके। – srcspider

4
+3

मैंने अभी प्रलेखन पढ़ा है, और यह एक का उपयोग करने की अनुशंसा करता है एक मूल्य से जुड़े सभी कुंजी खोजने के लिए rray_keys()। – Savageman

+0

@Savageman - सहमत। मैंने एक त्वरित बेंचमार्क चलाया और 'array_keys()' इस कार्य के लिए 'array_search()' से बेहतर प्रदर्शन करता प्रतीत होता है। – zombat

5

w/ओ फ्लिप का प्रयास करें:

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

सबसे शक्तिशाली समाधान array_filter का उपयोग करेंगे, जो आप अपने खुद के छानने समारोह को परिभाषित करने की अनुमति देता है।

लेकिन कुछ यह थोड़ा overkill है, अपनी स्थिति में कह सकते हैं ...
एक साधारण 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; 
    } 
} 
28

कैसे के बारे में:

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

या के लिए अनेक मान:

इस तरह, आपके मामले में, शायद चाल करना चाहिए

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

यह रोका जा सके मुख्य हानि भी, जो array_flip() का दुष्प्रभाव है। अगर आप अपने सरणी में अद्वितीय मान हैं

देखें

+1

काम नहीं करेगा अगर $ आईडी पहला सरणी तत्व है, इस तरह बेहतर: यदि (($ key = array_search ($ id, $ आइटम्स))! == झूठा) अनसेट ($ आइटम [$ कुंजी]); – Marek

+0

अच्छी पकड़, मैं इसे ठीक कर दूंगा। – zombat

+0

धन्यवाद @ ज़ोंबैट, यह मेरे लिए काम किया। – Pupil

5

आपका समाधान ही काम करते हैं:

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

एक बेहतर तरीका array_search साथ सेट नहीं हो सकता है, आवश्यक है, तो एक पाश में।

+0

आप सही हैं, लेकिन इस विशेष मामले में मुझे पूरा यकीन है कि मूल्य अद्वितीय हैं :) – Marek

33

मैं दूसरा जवाब जोड़ रहा हूं। मैंने यहां विभिन्न तरीकों का प्रयास करने के लिए त्वरित बेंचमार्किंग स्क्रिप्ट लिखी है।

$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() वैकल्पिक खोज पैरामीटर निर्दिष्ट के साथ, अब तक का सबसे अच्छा तरीका से हो रहा है। आउटपुट उदाहरण:

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

प्रभावशाली - धन्यवाद :) – Marek

+0

मुझे लगता है कि array_search array_diff विधि का उपयोग करने से कहीं अधिक पठनीय कोड है। उपरोक्त – kendepelchin

+0

@ ज़ोंबैट मुझे आश्चर्य है कि आदेश के परिणामों के साथ कुछ भी करने के लिए है। यह संभव है कि शफल उस मूल्य को डाल दें जिसे हम आगे या अंत के करीब खोज रहे हैं। इसके अलावा ... +1 –

14

से $arr

unset($arr[array_search($rm_val, $arr)]); 
3
function deleteValyeFromArray($array,$value) 
{ 
    foreach($array as $key=>$val) 
    { 
     if($val == $value) 
     { 
     unset($array[$key]); 
     } 
    } 
    return $array; 
} 
3

$rm_val दूर करने के लिए आपको इस कार्रवाई रेफरी के लिए array_splice फ़ंक्शन का उपयोग कर सकते हैं: array_splice

array_splice($array, array_search(58, $array), 1); 
की