현재 위치: > 최신 기사 목록> array_filter ()의 문제를 해결하는 방법 중첩 어레이를 필터링하지 못함

array_filter ()의 문제를 해결하는 방법 중첩 어레이를 필터링하지 못함

M66 2025-06-05

PHP에서 Array_Filter ()는 배열에서 요소를 필터링하는 데 사용할 수있는 매우 일반적인 기능입니다. 이 함수는 배열 및 콜백 함수 (콜백 함수가없는 경우 기본 부울 변환이 사용됩니다)를 허용하고 조건을 충족하는 요소 만 포함하는 새 배열을 반환합니다. Array_Filter () 는 간단한 1 차원 배열을 처리 할 때 매우 효과적이지만 중첩 배열을 처리 할 때 제자리가없는 것 같습니다. 그렇다면 왜 array_filter () 필터 중첩 어레이가 할 수 없습니까? 이 문제를 어떻게 해결할 수 있습니까? 아래의 깊이에 대해 논의 해 봅시다.

array_filter () 필터 중첩 어레이가없는 이유는 무엇입니까?

Array_Filter () 의 원래 의도는 1 차원 배열을 필터링하는 것입니다. 배열의 서브 어레이를 재귀 적으로 처리하지 않습니다. 즉, Array_Filter ()는 콜백 함수 만 배열의 최상위 요소에만 적용하고 중첩 배열의 요소를 완전히 무시합니다. 따라서 배열에 중첩 어레이가 포함 된 경우 array_filter ()는 이 중첩 어레이에서 요소를 효과적으로 필터링 할 수 없습니다.

예를 들어:

 $array = [
    1,
    2,
    [3, 4],
    5,
    [6, 7]
];

$result = array_filter($array, function($value) {
    return $value > 3;
});

print_r($result);

출력은 다음과 같습니다.

 Array
(
    [1] => 2
    [3] => Array
        (
            [0] => 3
            [1] => 4
        )

    [4] => Array
        (
            [0] => 6
            [1] => 7
        )
)

보시다시피, 중첩 어레이 [3, 4][6, 7] 은 필터링되지 않았지만 그 결과는 그대로 유지됩니다. array_filter ()가 중첩 배열에 재귀 적으로 들어 가지 않기 때문입니다.

이 문제를 해결하고 효과적인 필터링을 구현하는 방법은 무엇입니까?

중첩 어레이를 필터하는 가장 쉬운 솔루션은 재귀를 사용하는 것입니다. Array_Filter ()를 재귀 적으로 호출하면 중첩 어레이의 모든 요소를 ​​처리 할 수 ​​있습니다.

재귀 필터링의 구현은 다음과 같습니다.

 function array_filter_recursive($array, $callback) {
    return array_map(function($value) use ($callback) {
        if (is_array($value)) {
            return array_filter_recursive($value, $callback); // 중첩 어레이로 재귀 적으로 호출하십시오
        } else {
            return $callback($value) ? $value : null; // 개별 요소를 필터링하십시오
        }
    }, $array);
}

$array = [
    1,
    2,
    [3, 4],
    5,
    [6, 7]
];

$result = array_filter_recursive($array, function($value) {
    return $value > 3;
});

print_r($result);

출력 결과는 다음과 같습니다.

 Array
(
    [1] => 
    [2] => Array
        (
            [1] => 4
        )

    [3] => 
    [4] => Array
        (
            [0] => 6
            [1] => 7
        )
)

보시다시피, 배열의 각 요소는 필터링되고 중첩 어레이의 요소는 올바르게 필터링됩니다.

설명하다:
  • Array_Filter_Recursive ()는 각 요소에 대해 Array_Map ()을 사용하여 배열을 재귀 적으로 트래버합니다. 배열인지 확인하십시오. 배열 인 경우 Array_Filter_Recursive ()가 재귀 적으로 적용됩니다. 단일 값 인 경우 콜백 함수가 필터에 적용됩니다.

  • 이 구현에서는 값이 필터링됩니다. 실제 요구에 따라 콜백 함수의 동작을 조정하고 필터링 된 요소를 처리하는 방법을 결정할 수 있습니다.

결론적으로

Array_Filter () 자체는 1 차원 배열 만 필터링 할 수 있으며 중첩 어레이를 처리 할 수 ​​없습니다. array_filter () 또는 이와 유사한 사용자 정의 함수를 재귀 적으로 호출함으로써 중첩 어레이의 효율적인 필터링을 쉽게 수행 할 수 있습니다. 필요에 따라 콜백 함수의 논리를 수정하여보다 유연하고 다양한 시나리오에 적응할 수 있습니다.