연관 배열에서 중복 값 제거

8676 단어 arrayphp
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],
        ]
    ]
];


제거 규칙은 채널에서 중복된 '값'을 필터링하여 다시 표시되면 전체 항목을 제거해야 합니다(위 코드 스니핑에서 '제거'로 표시됨). 원하는 출력은 다음과 같습니다.

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


솔루션에 대한 설명을 볼 수 있습니다here.

좋은 웹페이지 즐겨찾기