PHP에서 Array_Filter ()는 배열에서 요소를 필터링하는 데 사용할 수있는 매우 일반적인 기능입니다. 이 함수는 배열 및 콜백 함수 (콜백 함수가없는 경우 기본 부울 변환이 사용됩니다)를 허용하고 조건을 충족하는 요소 만 포함하는 새 배열을 반환합니다. Array_Filter () 는 간단한 1 차원 배열을 처리 할 때 매우 효과적이지만 중첩 배열을 처리 할 때 제자리가없는 것 같습니다. 그렇다면 왜 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 () 또는 이와 유사한 사용자 정의 함수를 재귀 적으로 호출함으로써 중첩 어레이의 효율적인 필터링을 쉽게 수행 할 수 있습니다. 필요에 따라 콜백 함수의 논리를 수정하여보다 유연하고 다양한 시나리오에 적응할 수 있습니다.