Я пытаюсь удалить элементы из многомерного массива на основе значения. В этом случае, если ключ «год» под-массива имеет значение 2011, я хочу, чтобы этот суб-массив вышел.
Только для записи: я запускаю PHP 5.2.
Мой массив выглядит так:
Array ( [0] => Array ( [filmId] => 61359 [url] => http://www.moviemeter.nl/film/61359 [title] => Unstoppable [alternative_title] => [year] => 2011 [thumbnail] => http://img.ruphp.com/multidimensional-array/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 ) )
Попробуй это:
function removeElementWithValue($array, $key, $value){ foreach($array as $subKey => $subArray){ if($subArray[$key] == $value){ unset($array[$subKey]); } } return $array; }
сfunction removeElementWithValue($array, $key, $value){ foreach($array as $subKey => $subArray){ if($subArray[$key] == $value){ unset($array[$subKey]); } } return $array; }
Тогда вы бы назвали это следующим образом:
$array = removeElementWithValue($array, "year", 2011);
Попробуй это:
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; }
$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); }
с$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); }
с$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); }
Для одного известного значения поместите это в начало итерации через многомерный массив:
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 } }
Не знаю. Может быть, это выглядит хаки. Мне это нравится. Короткие, быстрые и простые.
Похоже, что цель фильтрации в этом случае заключалась в том, чтобы распечатать некоторое содержимое и пропустить некоторые, основываясь на определенных критериях. Если вы выполняете фильтрацию перед циклом, вам придется циклически перебирать всю вещь дважды – один раз для фильтрации и один раз для печати содержимого.
Если вы делаете это так, внутри цикла, это не требуется. Вы также не будете изменять свой массив, кроме внутренней части цикла, что может быть полезно, если вы не всегда хотите фильтровать эти критерии в частности.
Вы должны попробовать таким образом,
$ 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));
сforeach ($mainArray as $key => $mainData){ foreach ($subArray as $subData){ if($mainData['dataId'] == $subData['dataId']){ unset($mainArray[$key]); break; } } } var_dump(array_values($mainArray));
Это даст вам результат, который вам нужен, с новым индексом массива.