인수가있는 PHP array_filter
다음 코드가 있습니다.
function lower_than_10($i) {
return ($i < 10);
}
다음과 같이 배열을 필터링하는 데 사용할 수 있습니다.
$arr = array(7, 8, 9, 10, 11, 12, 13);
$new_arr = array_filter($arr, 'lower_than_10');
검사 할 숫자를 허용하도록 lower_than_10에 인수를 추가하려면 어떻게해야합니까? 내가 이것을 가지고 있다면 :
function lower_than($i, $num) {
return ($i < $num);
}
10을 $ num 또는 어떤 숫자로 전달하는 array_filter에서 호출하는 방법은 무엇입니까?
클로저를 사용하는 @Charles 의 솔루션에 대한 대안으로 실제로 문서 페이지 의 주석 에서 예제 를 찾을 수 있습니다 . 아이디어는 원하는 상태 ( $num
)와 콜백 메서드 ( $i
인수로 사용)로 객체를 만드는 것입니다 .
class LowerThanFilter {
private $num;
function __construct($num) {
$this->num = $num;
}
function isLower($i) {
return $i < $this->num;
}
}
사용법 ( 데모 ) :
$arr = array(7, 8, 9, 10, 11, 12, 13);
$matches = array_filter($arr, array(new LowerThanFilter(12), 'isLower'));
print_r($matches);
(!) 참고로, 당신은 지금 대체 할 수있는 LowerThanFilter
보다 일반적인와 NumericComparisonFilter
같은 방법으로 isLower
, isGreater
, isEqual
등 그냥 생각 - 그리고 데모를 ...
php 5.3 이상을 사용하는 경우 클로저 를 사용하여 코드를 단순화 할 수 있습니다.
$NUM = 5;
$items = array(1, 4, 5, 8, 0, 6);
$filteredItems = array_filter($items, function($elem) use($NUM){
return $elem < $NUM;
});
PHP 5.3 이상에서는 클로저를 사용할 수 있습니다 .
function create_lower_than($number = 10) {
// The "use" here binds $number to the function at declare time.
// This means that whenever $number appears inside the anonymous
// function, it will have the value it had when the anonymous
// function was declared.
return function($test) use($number) { return $test < $number; };
}
// We created this with a ten by default. Let's test.
$lt_10 = create_lower_than();
var_dump($lt_10(9)); // True
var_dump($lt_10(10)); // False
var_dump($lt_10(11)); // False
// Let's try a specific value.
$lt_15 = create_lower_than(15);
var_dump($lt_15(13)); // True
var_dump($lt_15(14)); // True
var_dump($lt_15(15)); // False
var_dump($lt_15(16)); // False
// The creation of the less-than-15 hasn't disrupted our less-than-10:
var_dump($lt_10(9)); // Still true
var_dump($lt_10(10)); // Still false
var_dump($lt_10(11)); // Still false
// We can simply pass the anonymous function anywhere that a
// 'callback' PHP type is expected, such as in array_filter:
$arr = array(7, 8, 9, 10, 11, 12, 13);
$new_arr = array_filter($arr, $lt_10);
print_r($new_arr);
여러 매개 변수를 함수에 전달해야하는 경우 ","를 사용하여 use 문에 추가 할 수 있습니다.
$r = array_filter($anArray, function($anElement) use ($a, $b, $c){
//function body where you may use $anElement, $a, $b and $c
});
jensgram 답변의 확장 에서 __invoke()
magic 메서드 를 사용하여 더 많은 마법을 추가 할 수 있습니다 .
class LowerThanFilter {
private $num;
public function __construct($num) {
$this->num = $num;
}
public function isLower($i) {
return $i < $this->num;
}
function __invoke($i) {
return $this->isLower($i);
}
}
이것은 당신이 할 수 있습니다
$arr = array(7, 8, 9, 10, 11, 12, 13);
$matches = array_filter($arr, new LowerThanFilter(12));
print_r($matches);
class ArraySearcher{
const OPERATOR_EQUALS = '==';
const OPERATOR_GREATERTHAN = '>';
const OPERATOR_LOWERTHAN = '<';
const OPERATOR_NOT = '!=';
private $_field;
private $_operation;
private $_val;
public function __construct($field,$operation,$num) {
$this->_field = $field;
$this->_operation = $operation;
$this->_val = $num;
}
function __invoke($i) {
switch($this->_operation){
case '==':
return $i[$this->_field] == $this->_val;
break;
case '>':
return $i[$this->_field] > $this->_val;
break;
case '<':
return $i[$this->_field] < $this->_val;
break;
case '!=':
return $i[$this->_field] != $this->_val;
break;
}
}
}
이를 통해 다차원 배열의 항목을 필터링 할 수 있습니다.
$users = array();
$users[] = array('email' => 'user1@email.com','name' => 'Robert');
$users[] = array('email' => 'user2@email.com','name' => 'Carl');
$users[] = array('email' => 'user3@email.com','name' => 'Robert');
//Print all users called 'Robert'
print_r( array_filter($users, new ArraySearcher('name',ArraySearcher::OPERATOR_EQUALS,'Robert')) );
참고 URL : https://stackoverflow.com/questions/5482989/php-array-filter-with-arguments
'Programming' 카테고리의 다른 글
다시로드 할 때 조각 새로 고침 (0) | 2020.08.25 |
---|---|
드롭 다운을 사용하는 경우 SQL 주입을 방지해야합니까? (0) | 2020.08.25 |
Safari 및 Chrome 데스크톱 브라우저에서 동영상 자동 재생이 작동하지 않습니다. (0) | 2020.08.25 |
코드 골프-파이 데이 (0) | 2020.08.25 |
포드 설치 오류 (0) | 2020.08.25 |