Как убрать дублирующиеся значения из многомерного массива в PHP?

Как убрать дублирующиеся значения из многомерного массива в PHP?

$arr = [
    'a' => [100, 101, 102],
    'b' => [100, 103, 104],
];

// Убираем дублирующиеся значения

// Ожидаемый результат

$arr = [
    'a' => [101, 102],
    'b' => [103, 104],
];

Всем спасибо, в итоге, на английском стаке нашёл такое решение, может кому то пригодится:

$seen = [];

foreach($arr as &$entry)
{
    $entry  = array_unique(array_diff($entry, $seen));
    $seen   = array_merge($entry, $seen);
}
unset($entry);

Правда, результат будет таким, но, мне это даже больше подходит:

$arr = [
    'a' => [100, 101, 102],
    'b' => [103, 104],
];

Ответы (2 шт):

Автор решения: Вадим Александру

Можно так

    $arr = [
    'a' => [100, 101, 102],
    'b' => [100, 103, 104],
];

$all_items = [];

foreach ($arr as $it) {
    $all_items = array_merge($all_items, $it);
}

$uses = array_count_values($all_items);

$response = [];

foreach ($arr as $key => $items) {
    $it = [];
    foreach ($items as $item) {
        if($uses[$item] === 1) {
            $it[] = $item;
        }
    }

    $arr[$key] = $it;
}

print_r($arr);
→ Ссылка
Автор решения: Евгений Тихии

Как вариант предлагаю решение...)


/* Исходный массив */
$rawArr = [
    'a' => [100, 101, 102, 105, 106],
    'b' => [100, 103, 104, 106, 105],
];

/* Записываем пересечения в новый $interArr массив */ 
$interArr = array_intersect ($rawArr['a'], $rawArr['b']);

/* Формируем новый массив в цикле */
foreach ($rawArr as $indexRaw => $valueRaw) {
    $diffArr[$indexRaw] = array_diff ($rawArr[$indexRaw], $interArr);
}

/* Массив без дублей */
echo '<pre>';
print_r ($diffArr);

Вывод:

Array
(
    [a] => Array
        (
            [1] => 101
            [2] => 102
        )

    [b] => Array
        (
            [1] => 103
            [2] => 104
        )

)
→ Ссылка