PHP에서 Array_Filter () 는 매우 일반적으로 사용되는 배열 처리 기능이며 주로 배열에서 요소를 필터링하는 데 사용됩니다. 이 함수는 유지되어야하는 요소를 정의하는 선택적 콜백 함수를 수신 할 수 있습니다. 콜백 함수가 제공되지 않으면 Array_Filter ()는 Array에서 False , NULL , 0 , 빈 문자열 및 빈 배열과 같은 "False 값"으로 배열에서 요소를 자동으로 제거합니다.
따라서 문제는 다음과 같습니다. 실제로 사용하면 기본 동작을 사용하여 Array_Filter ()를 사용하는 것과 사용자 정의 콜백 함수를 제공하는 것의 성능 차이는 무엇입니까? 어떤 방법이 더 효율적입니까?
이 기사는이 두 사용법의 실행 시간을 비교하고 테스트하여 성능 관점에서 심층 분석을 수행합니다.
// 기본 동작:배열을 제거하십시오“가짜 가치”
$result = array_filter($array);
// 콜백 함수를 사용하십시오:보다 크게 유지됩니다 0 가치
$result = array_filter($array, function($value) {
return $value > 0;
});
우리는 많은 수의 요소가있는 배열을 구성하고 기본 동작 및 사용자 정의 콜백 기능을 사용하여 각각 필터링합니다.
function testArrayFilterDefault($array) {
$start = microtime(true);
$result = array_filter($array);
return microtime(true) - $start;
}
function testArrayFilterCallback($array) {
$start = microtime(true);
$result = array_filter($array, function($value) {
return $value > 0;
});
return microtime(true) - $start;
}
// 테스트 배열을 구성하십시오,포함하다 100000 강요
$testArray = [];
for ($i = 0; $i < 100000; $i++) {
$testArray[] = $i % 2 === 0 ? 0 : $i; // 절반은 0,절반은整数
}
// 테스트를 수행하십시오
$timeDefault = testArrayFilterDefault($testArray);
$timeCallback = testArrayFilterCallback($testArray);
echo "기본 동작执行时间:{$timeDefault} 두번째\n";
echo "콜백 함수 실행 시간:{$timeCallback} 두번째\n";
위의 스크립트를 실행하면 대부분의 경우 기본 동작이 더 빨리 실행된다는 것을 알게됩니다. 이유는 다음과 같습니다.
기본 동작은 C 언어 계층에서 구현 된 내장 로직이며 실행 효율이 높습니다.
콜백 함수를 사용하는 경우 PHP는 매번 사용자 정의 함수를 호출해야하며, 특히 많은 양의 데이터 일 때는 기능 호출 오버 헤드를 무시할 수 없습니다.
샘플 출력 (특정 기계에 따라 약간 다름) :
기본 동작执行时间:0.012345 두번째
콜백 함수 실행 시간:0.035678 두번째
보시다시피, 기본 동작은 약 2 ~ 3 배 더 빠릅니다 .
기본 동작이 더 좋지만 제한 사항이 있습니다. "거짓 값"만 제거 할 수 있습니다. 필터링 로직이 특정 범위의 값을 유지하거나 유형 확인 등을 유지하는 등 약간 복잡한 경우에도 여전히 콜백 기능이 필요합니다.
예를 들어:
// 홀수 값을 유지하십시오
array_filter($array, function($v) {
return $v % 2 !== 0;
});
이것은 분명히 기본 동작을 통해 달성 할 수 없습니다.
$userInput = [
'name' => 'Alice',
'email' => '',
'age' => 0,
'newsletter' => false,
];
$cleanedInput = array_filter($userInput); // 只保留非가짜 가치字段
// 산출 ['name' => 'Alice']
이 예에서는 채워지지 않은 필드 ( False , Empty Strings 등)를 제거하려면 기본 동작이 매우 적절합니다. 비어 있지 않은 스트링 필드 만 보존하려면 콜백을 사용해야합니다.
$cleanedInput = array_filter($userInput, function($value) {
return is_string($value) && trim($value) !== '';
});
사용 방법 | 성능 | 유연성 | 시나리오를 사용하십시오 |
---|---|---|---|
기본 동작 | ? 효율적인 | ? 제한된 | 잘못된 값을 제거하십시오 |
콜백 함수를 사용하십시오 | ? 약간 느립니다 | ? 유연한 | 사용자 정의 필터링 로직 |
제안 : 잘못된 값을 제거하면 기본 동작을 사용하십시오. 더 복잡한 논리가 필요한 경우 콜백 함수를 사용하는 것은 불가피합니다.