Удаление дублирующегося значения из ассоциированного массива

Хотя array_unique может удалить дубликаты значений из массива, в некоторых ситуациях массив, с которым вам нужно работать, довольно сложный и совершенно не подходит для array_unique. Следующий массив представляет собой ассоциированный массив с дублирующимся значением во вложенном массиве:

$arr = [
    [
        'name' => 'a',
        'channels' => [
            ['id' => 1, 'value' => 111],
            ['id' => 2, 'value' => 222],
        ]
    ], [
        'name' => 'b',
        'channels' => [
            ['id' => 3, 'value' => 111], // remove
            ['id' => 4, 'value' => 333],
        ]
    ], [
        'name' => 'c',
        'channels' => [
            ['id' => 5, 'value' => 333], // remove
            ['id' => 6, 'value' => 333], // remove
            ['id' => 7, 'value' => 666],
            ['id' => 8, 'value' => 666], // remove
            ['id' => 9, 'value' => 888],
        ]
    ]
];
Войти в полноэкранный режим Выйти из полноэкранного режима

Правило удаления должно отфильтровать дублирующееся «значение» в каналах, если оно появится снова, то весь элемент должен быть удален (отмечен символом «remove» в приведенном выше фрагменте кода). Желаемый результат:

$arr = [
    [
        'name' => 'a',
        'channels' => [
            ['id' => 1, 'value' => 111],
            ['id' => 2, 'value' => 222],
        ]
    ], [
        'name' => 'b',
        'channels' => [
            ['id' => 4, 'value' => 333],
        ]
    ], [
        'name' => 'c',
        'channels' => [
            ['id' => 7, 'value' => 666],
            ['id' => 9, 'value' => 888],
        ]
    ]
];
Войти в полноэкранный режим Выход из полноэкранного режима

Самая сложная часть заключается в том, что трудно зацикливать массив и одновременно удалять элементы. Короткий ответ: не надо, не надо удалять элемент во время цикла массива. Одновременное выполнение этих действий может вызвать множество неожиданных ситуаций. Ниже приводится простое и понятное решение:

$unique = [];
foreach ($arr as &$item) {
    $newChannel = [];
    foreach ($item['channels'] as $key => $channelItem) {
        if (in_array($channelItem['value'], $unique)) {
            continue;
        }
        $newChannel []= $channelItem;
        $unique[] = $channelItem['value'];
    }
    $item['channels'] = $newChannel;
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы можете посмотреть мое объяснение этого решения здесь

Оцените статью
devanswers.ru
Добавить комментарий