2010-12-16 3 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

Попробуйте это:

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

Тогда вы могли бы назвать это так:

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

Я второй этот выбор. Хотя решение Якоба очень изящно, я бы не стал использовать рекурсию, если массив имеет уровень вложенности, который известен заранее, как в примере, показанном выше. Конечно, вы должны полагаться на рекурсию (или комбинацию array_map с in_array или аналогичными функциями, что может быть даже немного быстрее), если структура вашего массива не знает заранее. – maraspin 2010-12-16 23:53:43

+0

Спасибо за ваш ответ! Работает чудесно! – Bob 2010-12-17 14:28:10

8

Попробуйте это:

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 2017-06-08 22:47:33

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); 
} 
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 ваши текущие данные
$ подмассив это данные вы хотите удалить

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

    var_dump(array_values($mainArray)); 

Это даст вам вывод, что вы хотели с новым индексом массива.

Смежные вопросы