PHP 개발에서는 종종 배열에서 특정 조건을 충족하는 요소를 필터링해야합니다. 가장 일반적인 방법 중 하나는 필터링을위한 조건부 명세서와 함께 Foreach 루프를 사용하는 것입니다. 그러나 PHP 표준 라이브러리는 또한이 요구 사항을 위해 설계된보다 간결한 기능 인 Array_Filter () 를 제공합니다. 그런 다음 질문은 다음과 같습니다.
사용자 목록 배열이 있고 18 세 이상의 사용자를 필터링하려고합니다.
$users = [
['name' => 'Alice', 'age' => 22],
['name' => 'Bob', 'age' => 17],
['name' => 'Charlie', 'age' => 30],
];
$adults = [];
foreach ($users as $user) {
if ($user['age'] > 18) {
$adults[] = $user;
}
}
$users = [
['name' => 'Alice', 'age' => 22],
['name' => 'Bob', 'age' => 17],
['name' => 'Charlie', 'age' => 30],
];
$adults = array_filter($users, function($user) {
return $user['age'] > 18;
});
코드 가독성 측면에서 Array_Filter () 는 특히 논리가 단순 할 때 더 작고 명확합니다.
간단한 테스트 스크립트를 통해 두 가지의 데이터와 둘 사이의 성능 차이를 비교해 봅시다.
$users = [];
for ($i = 0; $i < 100000; $i++) {
$users[] = ['name' => "User$i", 'age' => rand(10, 50)];
}
// 사용 foreach
$start = microtime(true);
$adults1 = [];
foreach ($users as $user) {
if ($user['age'] > 18) {
$adults1[] = $user;
}
}
$time1 = microtime(true) - $start;
// 사용 array_filter
$start = microtime(true);
$adults2 = array_filter($users, function($user) {
return $user['age'] > 18;
});
$time2 = microtime(true) - $start;
echo "foreach 시간이 많이 걸립니다: {$time1} 두번째\n";
echo "array_filter 시간이 많이 걸립니다: {$time2} 두번째\n";
foreach 시간이 많이 걸립니다: 0.025 두번째
array_filter 시간이 많이 걸립니다: 0.027 두번째
알 수 있듯이, 성능 차이는 최소화되고 경우에 따라 Array_Filter () 가 본질적으로 내부적으로 루프를 사용하고 있으며 함수 호출의 오버 헤드와도 관련이 있기 때문에 Foreach 의 경우에도 약간 더 빠릅니다.
Array_Filter ()가 사용되는 권장 시나리오 :
조건은 간단하고 코드는 명확합니다.
기능적 스타일로 코드를 작성하고 싶습니다.
데이터 처리 체인은 다른 배열 함수 ( Array_Map () )와 함께 사용해야합니다.
권장 시나리오 foreach :
더 높은 성능과 궁극적 인 최적화가 필요합니다.
조건부 로직은 복잡하거나 루프 중단이 필요합니다.
원래 배열 (예 : 참조 할당 등)을 수행하려면 추가 작업이 필요합니다.
경우에 따라 Foreach는 약간 더 나을 수 있지만 Array_Filter ()는 특히 코드 가독성 및 유지 관리 가능성을 추구 할 때보다 우아한 솔루션을 제공합니다. 성능 측면에서, 둘 사이의 차이는 최소이며, 선택은 "효율성"을 맹목적으로 추구하기보다는 실제 시나리오를 기반으로해야합니다 .
코드를 이해하고 유지하기가 더 쉬워지면 Array_Filter ()를 시도해 볼 수도 있습니다!