PHP에서 array_filter ()는 콜백 함수의 결과에 따라 배열에서 요소를 필터링하는 데 사용되는 매우 일반적인 배열 기능입니다. 사용량은 단순 해 보일 수 있지만, 많은 개발자들은 특히 콜백 함수를 작성할 때 사용할 때 반환 가치의 "부울 의미"에 당황합니다.
예를 들어 누군가는 다음 코드를 썼습니다.
$input = [0, 1, 2, 3, 4, 5];
$result = array_filter($input, function($value) {
return $value % 2; // 홀수를 유지하기를 바랍니다
});
print_r($result);
그들은 출력이 [1, 3, 5] 가 될 것으로 기대할 수 있으며 결과도 마찬가지입니다. 그러나이 예를 약간 수정하면 쉽게 혼란을 일으킬 수 있습니다.
$input = [0, 1, 2, 3, 4, 5];
$result = array_filter($input, function($value) {
return $value % 2 == 0; // 숫자를 유지하기를 바랍니다
});
print_r($result);
많은 사람들은 요소가 참으로 돌아올 때 유지되고 거짓을 반환하면 필터링된다고 생각합니다. 이것은 참으로 사실입니다. 그러나 핵심은 -PHP는 동적으로 입력 한 언어이며 콜백 함수에 의해 반환 된 모든 값은 부울 값으로 캐스팅됩니다.
PHP의 이러한 값은 False 로 변환됩니다.
부울 가치 거짓
정수 0
부동 소수점 유형 0.0
빈 문자열 '' 또는 '0'
빈 배열 []
널
따라서 다음 코드를 작성하면 다음과 같습니다.
$input = ['a', '', 'b', '0', 'c'];
$result = array_filter($input);
print_r($result);
출력이 다음과 같습니다.
Array
(
[0] => a
[2] => b
[4] => c
)
콜백 함수가 지정되지 않으면 Array_Filter ()는 기본적으로 부울 캐스트를 사용하여 요소가 유지되는지 여부를 결정합니다. 따라서 빈 문자열 과 '0'은 모두 거짓 으로 변환되기 때문에 필터링됩니다.
현재 많은 사람들이 혼란 스러울 것입니다. "나는 분명히 가치가 있습니다. 왜 그것이 필터링 되었습니까?"
더 많은 오해는 일반적으로 개발자가 콜백을 사용하여 부울이 아닌 유형을 반환 할 때 발생합니다.
$input = [1, 2, 3, 4, 5, 6];
$result = array_filter($input, function($value) {
return $value & 1; // 비트를 사용하고 홀수를 판단하십시오
});
print_r($result);
이 코드는 정확하지만 초보자를 미치게 만들 수 있습니다. $ value & 1 의 결과는 0 또는 1 입니다 . $ 값이 짝수 숫자 인 경우 결과는 0 이며, 이는 False 로 변환되어 필터링됩니다. 이 시점에서, 당신은 1 또는 0 자체를 반환하는 값이 요소를 유지하는지 여부를 결정한다는 것이 아니라 부울 환경에서 이러한 값의 성능을 이해한다는 것을 이해해야합니다.
많은 사람들이 눈치 채지 못한 또 다른 사항 : Array_Filter ()는 원래 배열의 키 이름을 유지합니다. 인덱스를 재구성하려면 array_values ()를 사용할 수 있습니다.
$result = array_values(array_filter($input, function($value) {
return $value > 2;
}));
예를 들어, 일련의 URL에서 토큰 매개 변수없이 링크를 필터링하려고합니다.
$urls = [
'https://m66.net/page1?token=abc',
'https://m66.net/page2',
'https://m66.net/page3?token=xyz',
];
$filtered = array_filter($urls, function($url) {
$parts = parse_url($url);
if (!isset($parts['query'])) {
return false;
}
parse_str($parts['query'], $query);
return isset($query['token']);
});
print_r($filtered);
이 코드의 콜백 함수는 유형 변환에 의해 혼동되지 않도록 부울 값 ( true 또는 false )을 명시 적으로 반환합니다.
많은 사람들 이 array_filter () 콜백 함수의 반환 값에 대한 "부울 의미"를 이해하지 못합니다. 최종 분석에서, 그들은 PHP의 "진실 및 거짓 값"에 대한 깊은 이해가 없습니다. 신뢰할 수있는 array_filter () 콜백 함수를 작성하려면 다음을 기억하십시오.
콜백 함수의 반환 값은 부울 값으로 변환됩니다.
유형 (예 : 숫자 또는 문자열)에 "값"이 있는지 여부에 직접적으로 의존하지 않지만 명시 적으로 True 또는 False를 반환합니다.
당신의 의도가 명확한 논리적 판단이라면, 부울 표현을 명시 적으로 쓰십시오.
이런 식으로, 당신은이 강력하고 쉽게 오해 된 기능을 완전히 마스터 할 수 있습니다!