Очень информативно. Спасибо. Справлюсь.Печально.
$arr = array(array('a', 'b'), array('b', 'c'), array('c', 'd', 'c', 'c'));
$result = array_reduce($arr, function($a, $b) {
return array_unique($a += $b);
}, array());
var_dump($result); // array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
В результате должно получиться:Что должно быть в результате?
Array
(
[0] => Array
(
[key1] => A
[key2] => B
)
[2] => Array
(
[key1] => B
[key2] => C
)
[6] => Array
(
[key1] => C
[key2] => D
)
)
<?php
$arr = array(array('a', 'b'), array('b', 'c'), array('a', 'b'), array('a', 'b'));
$result = array_reduce($arr, function($a, $b) {
static $stored = array();
$hash = md5(serialize($b));
if (!in_array($hash, $stored)) {
$stored[] = $hash;
$a[] = $b;
}
return $a;
}, array());
var_dump($result); // array(2) { [0]=> array(2) { [0]=> string(1) "a" [1]=> string(1) "b" } [1]=> array(2) { [0]=> string(1) "b" [1]=> string(1) "c" } }
Что и требовалось доказать.Встроенными функциями никак. Только вручную через сериализацию и сравнение.
Понял.Эдди
Да те же яйца. Просто у меня получился "однострочник". Но логика-то та же самая.
$arr2 = $arr;
while (list($k1, $v1) = each($arr)) {
$res[$k1] = $v1;
foreach($arr2 as $k2=>$v2){
if ($k1===$k2) continue;
if (!is_array($v1) || !is_array($v2)) throw new exception();
if (!array_diff($v1,$v2)){
unset ($arr[$k2],$arr2[$k2]);
}
}
}
Читаем мануалgrigori
1. foreach копирует массив только тогда, когда его невозможно не копировать.
Как и у тебя!2. Омг, а у тебя ещё array_diff, третья вложенность.
Я не вижу в задаче ТСа условий эффективности исполнения."Ты не сделаешь проверку 2-мерного массива 1м циклом" --- если я упрусь в это место - я сделаю хэш ключом массива.
Я не вижу в задаче ТСа условий эффективности исполнения.[/quote]Читаем мануал
Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer.
Как и у тебя!