PHP: проверьте наличие повторяющихся значений в многомерном массиве

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

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

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") ) 

Как мне это сделать??

Это приведет к удалению повторяющихся элементов из массива с помощью array_unique() :

 $new_arr = array_unique($arr, SORT_REGULAR); 

Вы можете просто сделать это, используя 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" } } 

Попробуйте http://php.net/manual/en/function.array-unique.php, это должно вам помочь.

 $arr = ...; $final = array(); sort($arr); foreach ($arr as $el) { if (!isset($prev) || $el !== $prev) $final[] = $el $prev = $el; } 

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

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

Вы можете использовать смарт-сериализацию для сравнения массивов.

 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); } 

Повеселись

Чтобы проверить использование массива 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 } 

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