2016-08-29 3 views
2

Как удалить дубликаты в многомерном массиве? Я попробовал несколько ответов, найденных в stackoverflow, но ни один из них не работает для меня в многоуровневом массиве. Самый близкий ответ, который я нашел, был следующим:Как удалить дубликаты и оригинал из многомерного массива?

How to delete duplicates in an array? Но это работало только на одномерном массиве.

Например у меня есть это:

$array = array(
    [0] = array(
     [color] => red, 
     [type] => color, 
     [name] => color1 
    ) 
    [1] = array(
     [color] => gray, 
     [type] => color, 
     [name] => color2 
    ) 
    [2] = array(
     [color] => blue, 
     [type] => color, 
     [name] => color3 
    ) 
    [3] = array(
     [color] => green, 
     [type] => color, 
     [name] => color4 
    ) 
    [4] = array(
     [color] => black, 
     [type] => color, 
     [name] => color5 
    ) 
    [3] = array(
     [color] => gray, 
     [type] => color, 
     [name] => color2 
    ) 
    [4] = array(
     [color] => blue, 
     [type] => color, 
     [name] => color3 
    ) 
) 

Как я могу позволить ей стать это :?

$array = array(
    [0] = array(
     [color] => red, 
     [type] => color, 
     [name] => color1 
    ) 
    [1] = array(
     [color] => gray, 
     [type] => color, 
     [name] => color2 
    ) 
    [2] = array(
     [color] => blue, 
     [type] => color, 
     [name] => color3 
    ) 
    [3] = array(
     [color] => green, 
     [type] => color, 
     [name] => color4 
    ) 
    [4] = array(
     [color] => black, 
     [type] => color, 
     [name] => color5 
    ) 
) 
+0

Ваш вход и выход не имеет смысла. Как вы фильтруете наш «серый», например? Не ясно. –

+0

Я бы мог отфильтровать повторяющуюся строку и оригинал. Итак, массив 1 соответствует массиву 3. Удалите обе строки. – Red

+0

Прочитайте awnser. Он делает то, что я спросил. Так что «невозможно вообще» любопытный awnser – Red

ответ

3

Ну, это очень плохой ответ, но, похоже, вам нужны УНИКАЛЬНЫЕ данные, вот вам очень плохой код, чтобы решить эту проблему.

$array2 = array(); 
foreach ($array as $val) 
{ 
    @$array2[$val['color']]++; 
} 
foreach ($array as $key=>$val) 
{ 
    if ($array2[$val['color']] >1) 
    unset($array[$key]); 
} 

@ есть, чтобы предотвратить PHP сбрасывать ошибку. или вы можете написать больше кода для предопределения $array2, но это действительно работает.

+1

почему бы просто не набрать его^_ ^, его только одна строка для инициализации – Ghost

+0

вы можете сделать это на 1 строке? Я должен создать третий цикл foreach, чтобы он был прав. – Forbs

+0

Спасибо, это сделало то, что я хотел.Просто любопытно, есть ли однолинейное решение? – Red

0

Предположим, ваш массив это

$array = array(
    '0' => array(
     'color' => 'red', 
     'type' => 'color', 
     'name' => 'color1' 
    ), 
    '1' => array(
     'color' => 'gray', 
     'type' => 'color', 
     'name' => 'color2' 
    ), 
    '2' => array(
     'color' => 'blue', 
     'type' => 'color', 
     'name' => 'color3' 
    ), 
    '3' => array(
     'color' => 'green', 
     'type' => 'color', 
     'name' => 'color4' 
    ), 
    '4' => array(
     'color' => 'black', 
     'type' => 'color', 
     'name' => 'color5' 
    ), 
    '5' => array(
     'color' => 'gray', 
     'type' => 'color', 
     'name' => 'color2' 
    ), 
    '6' => array(
     'color' => 'blue', 
     'type' => 'color', 
     'name' => 'color3' 
    ) 
); 

Код

$input = array_map("unserialize", array_unique(array_map("serialize", $array))); 
echo ' <pre>'; 
print_r($input); 

Выход

Array 
(
    [0] => Array 
     (
      [color] => red 
      [type] => color 
      [name] => color1 
     ) 

    [1] => Array 
     (
      [color] => gray 
      [type] => color 
      [name] => color2 
     ) 

    [2] => Array 
     (
      [color] => blue 
      [type] => color 
      [name] => color3 
     ) 

    [3] => Array 
     (
      [color] => green 
      [type] => color 
      [name] => color4 
     ) 

    [4] => Array 
     (
      [color] => black 
      [type] => color 
      [name] => color5 
     ) 

) 
+0

OP хочет вынуть (не включать) значения массива с дубликатами, проверить ожидаемый, и первый ответ уже правильный – Ghost

1

Вы можете получить счетчик с олоры, чтобы вы могли отличить, которые будут удалены и будут сохранены.

Затем после этого вы узнаете, какой цвет сохранить.

Чтобы получить счет, просто используйте array_count_values, чтобы получить, что сохранить. Тогда, наконец, фильтр:

$a = array_count_values(array_column($array, 'color')); 
$new_array = array_filter($array, function($e) use($a) { 
    return $a[$e['color']] === 1; // filter count equal to 1 
}); 

Это использует array_column, которые не могут быть доступны на вашей среде, вы можете использовать эту линию в качестве альтернативы:

$a = array_count_values(array_map(function($e){ return $e['color']; }, $array)); 
+0

Спасибо за азерсера. Тем не менее, принятый айнсер работал для меня как шарм;) – Red

+0

@ Рихард Мауриц уверен, что нет проблем – Ghost

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