Intereting Posts
Как обойти Laravel Обработка исключений mySQL не удалось получить сообщения за последние 24 часа и последние 60 минут Как я могу очистить содержимое веб-сайта на PHP с веб-сайта, для которого требуется вход в cookie? SMTP-адрес электронной почты не отправляется на iPhone cordova WebApp, работая в браузере? Вопросительный знак на имя файла с помощью fopen Сообщение об ошибке № 100 при использовании Facebook open graph api Codeigniter & HTML5 – попытка одновременного загрузки нескольких изображений Запрещено: у вас нет разрешения на доступ / phpmyadmin на этом сервере Объединение 2 файлов CSV Невозможно передать значение параметра в репозиторий findOneBy Symfony Я получаю ошибку, когда я использую mysqli select Быстрее или лучше использовать MySQL вместо текстовых файлов или имен файлов для порядка изображений с PHP? изменение локального ключа реестра с помощью PHP Symfony2 / Doctrine: SQL to DQL для построителя запросов в репозитории, чтобы создать форму поиска PHP: как я могу сортировать и фильтровать «массив», то есть объект, реализующий ArrayAccess?

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); } 

как вызвать его из array_filter, проходящего от 10 до $ num или любого другого номера?

Solutions Collecting From Web of "PHP 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); 

В дополнение к ответу jensgram вы можете добавить еще магия с помощью магического метода __invoke() .

 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); 

если вам нужно передать несколько параметров для функции, вы можете добавить их в оператор использования, используя «,»:

 $r = array_filter($anArray, function($anElement) use ($a, $b, $c){ //function body where you may use $anElement, $a, $b and $c }); 
 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')) );