2010-12-16 18 views
29

पर आधारित बहुआयामी-सरणी से तत्व हटाएं मैं मूल्य पर आधारित एक बहुआयामी-सरणी से तत्वों को हटाने की कोशिश कर रहा हूं। इस मामले में यदि उप-सरणी की कुंजी 'वर्ष' में मूल्य 2011 है तो मैं उस उप-सरणी को बाहर करना चाहता हूं।मान

बस रिकॉर्ड के लिए: मैं PHP 5.2 चला रहा हूं।

मेरे सरणी इस तरह दिखता है:

Array 
(
    [0] => Array 
     (
      [filmId] => 61359 
      [url] => http://www.moviemeter.nl/film/61359 
      [title] => Unstoppable 
      [alternative_title] => 
      [year] => 2011 
      [thumbnail] => http://www.moviemeter.nl/images/covers/thumbs/61000/61359.jpg 
      [average] => 0 
      [votes_count] => 0 
      [similarity] => 100.00 
      [directors_text] => geregisseerd door Richard Harrison 
      [actors_text] => met Chen Shilony, Ruben Crow en David Powell 
      [genres_text] => Drama/Komedie 
      [duration] => 90 
     ) 
    [1] => Array 
     (
      [filmId] => 87923 
      [url] => http://www.moviemeter.nl/film/87923 
      [title] => Unstoppable 
      [alternative_title] => 
      [year] => 2011 
      [thumbnail] => http://www.moviemeter.nl/images/covers/thumbs/87000/87923.jpg 
      [average] => 0 
      [votes_count] => 0 
      [similarity] => 100.00 
      [directors_text] => geregisseerd door Example Director 
      [actors_text] => met Actor 1, Actor 2 en Actor 3 
      [genres_text] => Drama/Komedie 
      [duration] => 90 
     ) 
    [2] => Array 
     (
      [filmId] => 68593 
      [url] => http://www.moviemeter.nl/film/68593 
      [title] => Unstoppable 
      [alternative_title] => 
      [year] => 2010 
      [thumbnail] => http://www.moviemeter.nl/images/covers/thumbs/68000/68593.jpg 
      [average] => 3.3 
      [votes_count] => 191 
      [similarity] => 100.00 
      [directors_text] => geregisseerd door Tony Scott 
      [actors_text] => met Denzel Washington, Chris Pine en Rosario Dawson 
      [genres_text] => Actie/Thriller 
      [duration] => 98 
     ) 
    [3] => Array 
     (
      [filmId] => 17931 
      [url] => http://www.moviemeter.nl/film/17931 
      [title] => Unstoppable 
      [alternative_title] => Nine Lives 
      [year] => 2004 
      [thumbnail] => http://www.moviemeter.nl/images/covers/thumbs/17000/17931.jpg 
      [average] => 2.64 
      [votes_count] => 237 
      [similarity] => 100.00 
      [directors_text] => geregisseerd door David Carson 
      [actors_text] => met Wesley Snipes, Jacqueline Obradors en Mark Sheppard 
      [genres_text] => Actie/Thriller 
      [duration] => 96 
     ) 
) 

उत्तर

60

इस प्रयास करें

$array = removeElementWithValue($array, "year", 2011); 
+0

मैं इस विकल्प को दूसरा करता हूं। यद्यपि जैकब समाधान बहुत ही सुरुचिपूर्ण है, लेकिन अगर सरणी में घोंसले का स्तर होता है, तो मैं पुनरावृत्ति का उपयोग करके परेशान नहीं होता हूं, जैसा ऊपर दिखाया गया उदाहरण है। बेशक, आप प्रत्यावर्तन (या in_array या इसी तरह काम करता है, जो भी एक छोटे से तेजी से किया जा सकता है के साथ array_map का एक संयोजन) पर भरोसा करने की अगर आपके सरणी की संरचना पहले से पता नहीं है। – maraspin

+0

आपकी प्रतिक्रिया के लिए धन्यवाद! अद्भुत काम करता है! – Bob

+3

बस एक sidenote पर: मैं परिणाम प्राप्त नहीं कर सका। यकीन नहीं है कि मैंने क्या गलत किया लेकिन मैंने इसे अपने मामले में तय किया।मुझे "वापसी $ सरणी" जोड़ना पड़ा; फोरैच लूप के बाद, और इसे इस तरह कॉल करें: $ array = removeElementWithValue ($ array, "year", 2011); जो लोग भविष्य में इसका उपयोग कर रहे हैं और इंडेक्स को फिर से व्यवस्थित करना चाहते हैं, आप निम्न का उपयोग कर सकते हैं: $ array = array_values ​​($ array); – Bob

8

इस प्रयास करें:

function removeElementWithValue($array, $key, $value){ 
    foreach($array as $subKey => $subArray){ 
      if($subArray[$key] == $value){ 
       unset($array[$subKey]); 
      } 
    } 
    return $array; 
} 

तो फिर तुम इसे इस तरह कहेंगे:

function remove_element_by_value($arr, $val) { 
    $return = array(); 
    foreach($arr as $k => $v) { 
     if(is_array($v)) { 
     $return[$k] = remove_element_by_value($v, $val); //recursion 
     continue; 
     } 
     if($v == $val) continue; 
     $return[$k] = $v; 
    } 
    return $return; 
} 
+0

एकाधिक उप सरणी में वही मान मौजूद है? वे सभी हटा दिए जाते हैं? क्या हम कुंजी के आधार पर एक विशेष उप सरणी को लक्षित कर सकते हैं? – Luke

4
$array[] = array('year' => 2010, "genres_text" => "Drama/Komedie"); 
$array[] = array('year' => 2011, "genres_text" => "Actie/Thriller"); 
$array[] = array('year' => "2010", "genres_text" => "Drama/Komedie"); 
$array[] = array('year' => 2011, "genres_text" => "Romance"); 

print_r(remove_elm($array, "year", 2010)); // removes the first sub-array only 
print_r(remove_elm($array, "year", 201)); // will not remove anything 
print_r(remove_elm($array, "genres_text", "drama", TRUE)); // removes all Drama 
print_r(remove_elm($array, "year", 2011, TRUE)); // removes all 2011 

function remove_elm($arr, $key, $val, $within = FALSE) { 
    foreach ($arr as $i => $array) 
      if ($within && stripos($array[$key], $val) !== FALSE && (gettype($val) === gettype($array[$key]))) 
       unset($arr[$i]); 
      elseif ($array[$key] === $val) 
       unset($arr[$i]); 

    return array_values($arr); 
} 
+0

धन्यवाद अगर आप। मुझे आपके समाधान की तरह लगता है क्योंकि मैं इसके साथ बहुत सी चीजें कर सकता हूं। मैं इसे एक "दूसरा" स्वीकृत उत्तर रखूंगा। – Bob

+0

@ बी एम, दूसरा स्वीकार किया? क्या हमारे पास स्टैक ओवरफ्लो में ऐसा कुछ है? वैसे भी, खुशी हुई यह मदद की! – ifaour

1

एक एकल, ज्ञात मूल्य के लिए, बहुआयामी सरणी के माध्यम से यात्रा की शुरुआत में इस डाल:

foreach ($array as $subarray) { 
    //beginning of the loop where you do things with your array 
    if ($subarray->$key == '$valueToRemoveArrayBy') continue; 
    //iterate your stuff 
} 

सीधे शब्दों में छोड़ देता है तो आपके मानदंड सत्य हैं, तो यह है कि पूरी यात्रा।

वैकल्पिक रूप से आप विपरीत कर सकते हैं। स्वाद के आधार पर पढ़ने के लिए आसान हो सकता है:

foreach ($array as $subarray) { 
    if ($subarray->$key != $valueToRemoveArrayBy) { 
    //do stuff 
    } 
} 

मुझे पता नहीं। शायद यह कुछ के लिए हैकी दिखता है। यद्यपि मुझे यह पसंद है। छोटा, त्वरित और सरल।

इस मामले में फ़िल्टरिंग के उद्देश्य की तरह कुछ सामग्रियों को प्रिंट करना और कुछ मानदंडों के आधार पर कुछ छोड़ना था। यदि आप लूप से पहले फ़िल्टरिंग करते हैं, तो आपको पूरी चीज़ को दो बार लूप करना होगा - फ़िल्टर करने के बाद और एक बार सामग्री प्रिंट करने के लिए।

यदि आप इसे लूप के अंदर ऐसा करते हैं, तो इसकी आवश्यकता नहीं है। आप लूप के अंदर को छोड़कर अपनी सरणी को भी नहीं बदल पाएंगे, जो उपयोगी हो सकता है यदि आप हमेशा इन मानदंडों द्वारा विशेष रूप से फ़िल्टर नहीं करना चाहते हैं।

0

आप इस तरह की कोशिश करनी चाहिए,
$ mainArray अपने वर्तमान डेटा
$ subarray डेटा आप

foreach ($mainArray as $key => $mainData){ 
     foreach ($subArray as $subData){ 
      if($mainData['dataId'] == $subData['dataId']){ 
       unset($mainArray[$key]); 
       break; 
      } 
     } 
    } 

    var_dump(array_values($mainArray)); 

दूर करने के लिए यह आपको उत्पादन आप सरणी के नए सूचकांक के साथ करना चाहता था दे देंगे चाहते है।