PHP에서 Array_Filter ()는 배열에서 조건을 충족하는 요소를 필터링하는 매우 편리한 기능입니다. 그러나 우리가 수십만 또는 수백만의 요소와 같은 하나에 직면 할 때 성능 문제가 고려해야 할 요소가 될 수 있습니다.
이 기사는 큰 배열을 처리 할 때 Array_Filter () 의 성능을 분석하고 실질적인 최적화 전략을 탐색합니다.
PHP에서 array_filter () 의 기본 구문은 다음과 같습니다.
$result = array_filter($array, function($value) {
return 상태;
});
배열의 각 요소에서 콜백 함수를 한 번 호출하고 반환 하는 요소를 유지하여 작동합니다.
이는 시간 복잡성이 O (N) 이라는 것을 의미하며 여기서 N은 배열 요소의 수입니다.
큰 배열을 다룰 때 성능 병목 현상은 다음과 같은 측면에서 나올 수 있습니다.
콜백 함수 자체의 복잡성 : 콜백 로직이 매우 복잡한 경우 성능 소비가 두 배가됩니다.
메모리 사용 : Array_Filter ()는 새 배열을 생성하고 원래 배열은 여전히 메모리에 유지되므로 빅 데이터를 처리 할 때 많은 메모리를 섭취 할 수 있습니다.
익명 기능의 오버 헤드 : 익명 기능은 매우 구문 적으로 우아하지만 고성능 시나리오에서는 통화 오버 헤드가 일반 기능보다 약간 높을 수 있습니다.
$largeArray = range(1, 1000000);
$filtered = array_filter($largeArray, function($value) {
return $value % 2 === 0;
});
이 예제의 조건은 매우 간단하지만 실제 프로젝트에서는 콜백 기능이 일반적으로 더 복잡하고 실행 효율이 크게 줄어 듭니다.
간단한 필터링 작업 만 수행 해야하는 경우 Foreach를 사용하여 Array_Filter ()를 교체하고 콜백 기능으로 인한 추가 오버 헤드를 피할 수 있습니다.
$filtered = [];
foreach ($largeArray as $value) {
if ($value % 2 === 0) {
$filtered[] = $value;
}
}
대부분의 경우,이 방법은 array_filter () 보다 효율적입니다.
폐쇄의 오버 헤드는 약간 높습니다. 자주 호출하면 로직을 지명 된 함수로 쓸 수 있습니다.
function isEven($value) {
return $value % 2 === 0;
}
$filtered = array_filter($largeArray, 'isEven');
배열이 매우 큰 경우 한 번에 많은 양의 메모리를 소비하지 않도록 배치로 처리하는 것이 좋습니다.
$chunks = array_chunk($largeArray, 10000);
$filtered = [];
foreach ($chunks as $chunk) {
$filtered = array_merge($filtered, array_filter($chunk, 'isEven'));
}
때로는 PHP 계층에서 쓸모없는 데이터를 처리하지 않기 위해 데이터베이스 또는 인터페이스에서 필터링 조건을 추가하는 등 데이터 소스에서 예비 필터링을 수행 할 수 있습니다.
예를 들어:
// 잘못된 방법:모든 데이터를 먼저 크롤링 한 다음 필터링하십시오
$data = file_get_contents('https://m66.net/api/data');
$decoded = json_decode($data, true);
$filtered = array_filter($decoded, 'isEven');
// 더 나은 접근:API 参数中加入筛选상태
$data = file_get_contents('https://m66.net/api/data?filter=even');
$filtered = json_decode($data, true);
모든 데이터를 한 번에 반환 할 필요가 없으면 생성기를 사용하여 게으른로드 할 수 있습니다.
function filterEven($array) {
foreach ($array as $value) {
if ($value % 2 === 0) {
yield $value;
}
}
}
foreach (filterEven($largeArray) as $even) {
// 실시간 처리 $even
}
생성기는 모든 결과를 메모리에 저장하지 않지만 한 번에 일치하는 값을 반환합니다. 이는 매우 자원 절약입니다.
Array_Filter ()는 구문이 매우 높고 대부분의 중소형 배열에 적합하지만 실제로 큰 배열을 처리 할 때 특정 성능 위험이 있습니다. Foreach 대체, 콜백 로직 최적화, 배치 처리 또는 생성기를 사용하여 성능을 크게 향상시킬 수 있습니다.
성능에 민감한 프로젝트에서 데이터를 필터링하는 가장 적절한 방법을 선택하는 것이 코드 최적화의 핵심입니다.