현재 위치: > 최신 기사 목록> Array_Filter ()를 사용하는 것이 큰 배열에서 최적화 할 가치가 있습니까?

Array_Filter ()를 사용하는 것이 큰 배열에서 최적화 할 가치가 있습니까?

M66 2025-06-05

PHP에서 Array_Filter ()는 배열에서 조건을 충족하는 요소를 필터링하는 매우 편리한 기능입니다. 그러나 우리가 수십만 또는 수백만의 요소와 같은 하나에 직면 할 때 성능 문제가 고려해야 할 요소가 될 수 있습니다.

이 기사는 큰 배열을 처리 할 때 Array_Filter () 의 성능을 분석하고 실질적인 최적화 전략을 탐색합니다.

1. Array_Filter ()는 어떻게 작동합니까?

PHP에서 array_filter () 의 기본 구문은 다음과 같습니다.

 $result = array_filter($array, function($value) {
    return 상태;
});

배열의 각 요소에서 콜백 함수를 한 번 호출하고 반환 하는 요소를 유지하여 작동합니다.

이는 시간 복잡성이 O (N) 이라는 것을 의미하며 여기서 N은 배열 요소의 수입니다.

2. 성능 병목 현상은 무엇입니까?

큰 배열을 다룰 때 성능 병목 현상은 다음과 같은 측면에서 나올 수 있습니다.

  1. 콜백 함수 자체의 복잡성 : 콜백 로직이 매우 복잡한 경우 성능 소비가 두 배가됩니다.

  2. 메모리 사용 : Array_Filter ()는 새 배열을 생성하고 원래 배열은 여전히 ​​메모리에 유지되므로 빅 데이터를 처리 할 때 많은 메모리를 섭취 할 수 있습니다.

  3. 익명 기능의 오버 헤드 : 익명 기능은 매우 구문 적으로 우아하지만 고성능 시나리오에서는 통화 오버 헤드가 일반 기능보다 약간 높을 수 있습니다.

예 : 기본 사용 및 성능

 $largeArray = range(1, 1000000);

$filtered = array_filter($largeArray, function($value) {
    return $value % 2 === 0;
});

이 예제의 조건은 매우 간단하지만 실제 프로젝트에서는 콜백 기능이 일반적으로 더 복잡하고 실행 효율이 크게 줄어 듭니다.

3. 최적화 제안

1. 기본 기능 또는 논리를 사용하여 대체를 판단하십시오

간단한 필터링 작업 만 수행 해야하는 경우 Foreach를 사용하여 Array_Filter ()를 교체하고 콜백 기능으로 인한 추가 오버 헤드를 피할 수 있습니다.

 $filtered = [];
foreach ($largeArray as $value) {
    if ($value % 2 === 0) {
        $filtered[] = $value;
    }
}

대부분의 경우,이 방법은 array_filter () 보다 효율적입니다.

2. 클로저를 피하고 명명 된 기능을 사용하십시오

폐쇄의 오버 헤드는 약간 높습니다. 자주 호출하면 로직을 지명 된 함수로 쓸 수 있습니다.

 function isEven($value) {
    return $value % 2 === 0;
}

$filtered = array_filter($largeArray, 'isEven');

3. 청킹

배열이 매우 큰 경우 한 번에 많은 양의 메모리를 소비하지 않도록 배치로 처리하는 것이 좋습니다.

 $chunks = array_chunk($largeArray, 10000);
$filtered = [];

foreach ($chunks as $chunk) {
    $filtered = array_merge($filtered, array_filter($chunk, 'isEven'));
}

4. 유효하지 않은 데이터 소스를 미리 제외합니다

때로는 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);

5. 생성기를 사용하십시오

모든 데이터를 한 번에 반환 할 필요가 없으면 생성기를 사용하여 게으른로드 할 수 있습니다.

 function filterEven($array) {
    foreach ($array as $value) {
        if ($value % 2 === 0) {
            yield $value;
        }
    }
}

foreach (filterEven($largeArray) as $even) {
    // 실시간 처리 $even
}

생성기는 모든 결과를 메모리에 저장하지 않지만 한 번에 일치하는 값을 반환합니다. 이는 매우 자원 절약입니다.

4. 요약

Array_Filter ()는 구문이 매우 높고 대부분의 중소형 배열에 적합하지만 실제로 큰 배열을 처리 할 때 특정 성능 위험이 있습니다. Foreach 대체, 콜백 로직 최적화, 배치 처리 또는 생성기를 사용하여 성능을 크게 향상시킬 수 있습니다.

성능에 민감한 프로젝트에서 데이터를 필터링하는 가장 적절한 방법을 선택하는 것이 코드 최적화의 핵심입니다.