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 шт):

Автор решения: Вадим Александру

Я не уверен, что правильно понял ваш вопрос, если что подправите.

  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;
         }
    }
    
  2. Создаем экземпляр нашего класса и добавим два фильтра

    $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;
    });
    
  3. Сама фильтрация

    $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
            )
    
    )
    */
    
→ Ссылка