PHP: как вывести условие для array_filter() за пределы функции?
У нас есть массив:
$array = [
[
'id' => '1',
'title' => 'Страница 1',
'price' => '100'
],
[
'id' => '2',
'title' => 'Страница 2',
'price' => '200'
],
[
'id' => '3',
'title' => 'Страница 3',
'price' => '300'
]
];
Вот фильтрация этого массива:
$array = array_filter($array, function ($array) {
return $array['price'] > 100 && $array['title'] != 'Страница 3';
});
Как вывести условие return за пределы функции, чтобы каждый раз ее не вызывать, а только вставлять условие?
Ответы (1 шт):
Автор решения: Вадим Александру
→ Ссылка
Я не уверен, что правильно понял ваш вопрос, если что подправите.
Создадим класс, который будет содержать все наши условия.
class MyFilter { private $filters = []; public function addFilter(callable $filter) { $this->filters[] = $filter; } /** * @param array $data * Возвращаем true если для $data справедливо хотябы одно условие */ public function filter(array $data) { foreach ($this->filters as $filter) { if($filter($data)) { return true; } } return false; } }Создаем экземпляр нашего класса и добавим два фильтра
$myFilter = new MyFilter(); $myFilter->addFilter(function ($data) { return $data['price'] > 100 && $data['title'] != 'Страница 3'; }); $myFilter->addFilter(function ($data) { return $data['id'] == 3 && $data['price'] == 300; });Сама фильтрация
$array = [ [ 'id' => '1', 'title' => 'Страница 1', 'price' => '100' ], [ 'id' => '2', 'title' => 'Страница 2', 'price' => '200' ], [ 'id' => '3', 'title' => 'Страница 3', 'price' => '300' ] ]; $filterate = array_filter($array, function ($data) use ($myFilter) { return $myFilter->filter($data); }); print_r($filterate); /* ВЫВОД Array ( [1] => Array ( [id] => 2 [title] => Страница 2 [price] => 200 ) [2] => Array ( [id] => 3 [title] => Страница 3 [price] => 300 ) ) */
