PHP: проверка на наличие дублирующихся значений в многомерном массиве - PullRequest
5 голосов
/ 09 февраля 2011

У меня есть эта проблема с многомерными массивами.

Учитывая следующий многомерный массив:

Array(
[0] => Array("a", "b", "c")
[1] => Array("x", "y", "z")
[2] => Array("a", "b", "c")
[3] => Array("a", "b", "c")
[4] => Array("a", "x", "z")
)

Я хочу проверить его значения и найти дубликаты (то есть ключи 0, 2 и 3)оставляя только одну пару ключ-значение, удаляя остальные, что приводит к чему-то вроде этого:

Array(
    [0] => Array("a", "b", "c")
    [1] => Array("x", "y", "z")
    [2] => Array("a", "x", "z")
    )

Как я могу это сделать ??

Ответы [ 5 ]

11 голосов
/ 09 февраля 2011

Это удалит дубликаты из вашего массива, используя array_unique():

$new_arr = array_unique($arr, SORT_REGULAR);
3 голосов
/ 09 февраля 2011

Вы можете просто сделать это, используя in_array ()

$data = Array(
    0 => Array("a", "b", "c"),
    1 => Array("x", "y", "z"),
    2 => Array("a", "b", "c"),
    3 => Array("a", "b", "c"),
    4 => Array("a", "x", "z"),
);

$final = array();
foreach ($data as $array) {
    if(!in_array($array, $final)){
        $final[] = $array;
    }
}

, что даст вам что-то вроде

array(3) {
  [0] => array(3) {
    [0] => string(1) "a"
    [1] => string(1) "b"
    [2] => string(1) "c"
  }
  [1] => array(3) {
    [0] => string(1) "x"
    [1] => string(1) "y"
    [2] => string(1) "z"
  }
  [2] => array(3) {
    [0] => string(1) "a"
    [1] => string(1) "x"
    [2] => string(1) "z"
  }
}
1 голос
/ 09 февраля 2011

С сериализацией можно идти умнее для сравнения массивов.

var_dump(makeUnique($data));

function makeUnique(array $data)
{
    $serialized = array_map(create_function('$a', 'return serialize($a);'), $data);
    $unique = array_unique($serialized);
    return array_intersect_key($unique, $data);
}

Веселись

0 голосов
/ 29 января 2013

Чтобы проверить использование array_unique для многомерных массивов, вам нужно сгладить его, используя implode.

    $c=count($array)
    for($i=0;$i<$c;$i++)
    {
    $flattened=implode("~",$array[$i]);
    $newarray[$i]=$flattened;
     }
    if(count(array_unique($newarray)
    <count($newarray))
    {
    //returns true if $array contains duplicates
    //can also use array_unique on $newarray 
    //to remove   duplicates, then explode, 
    //to return to default state
    }

Надеюсь, что это полезно, потребовалось некоторое время, чтобы получить его.

0 голосов
/ 09 февраля 2011
$arr = ...;
$final = array();
sort($arr);
foreach ($arr as $el) {
   if (!isset($prev) || $el !== $prev)
       $final[] = $el
    $prev = $el;
}

Это более эффективное решение 1 (log n + n вместо квадратичного), но оно основано на общем порядке между всеми элементами массива, который может отсутствовать (например,если у внутренних массивов есть объекты).

1 Более эффективно, чем использование in_array.Оказывается, array_unique на самом деле использует этот алгоритм, поэтому он имеет те же недостатки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...