У меня проблема с многомерными массивами.
Учитывая следующий многомерный массив:
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 }
Надеюсь, это полезно, потребовалось некоторое время, чтобы получить его.