Замена конструкции if на что то изящное)

Nubcoder32

Добрый день форумчане. Собственно проблема: есть такой кусок кода, хотелось бы привести его к божескому виду, может swich? Но на входе массив, подскажите как упростить

PHP:
  1.      
  2.         if($this->params[‘alias’]) {
  3.             $this->requestParam .= ‘ AND alias = ?’;
  4.             array_push($this->requestAtr, $this->params[‘alias’]);
  5.         }
  6.      
  7.         if($this->params[‘forSale’]) {
  8.             $this->requestParam .= ‘ AND old_price > ?’;
  9.             array_push($this->requestAtr, ‘0’);
  10.         }
  11.      
  12.         if($this->params[‘category’]) {
  13.             $this->requestParam .= ‘ AND category_id = ?’;
  14.             array_push($this->requestAtr, $params[‘category’]);
  15.         }
  16.      
  17.         if($this->params[‘categoryArray’]) {
  18.             $this->requestParam .= ‘ AND category_id IN (‘.R::genSlots($params[‘categoryArray’]).‘)’;
  19.             $this->requestAtr = array_merge($this->requestAtr, $params[‘categoryArray’]);
  20.         }
  21.         // Случайныe
  22.         if($this->params[‘rand’]){
  23.             $this->requestParam .= ‘ ORDER BY RAND()’;
  24.         }
  25.      
  26.         if($this->params[‘limit’]){
  27.             $this->requestParam .= ‘ LIMIT ?’;
  28.             array_push($this->requestAtr, $params[‘limit’]);
  29.         }
 

mkramer

Можно массив анонимных функций сделать, хотя в принципе и так неплохо. Для фильтров типичен такой код.

PHP:
  1. $filters = [
  2.     «alias» => function () {
  3.         $this->requestParam .= ‘ AND alias = ?’;
  4.         array_push($this->requestAtr, $this->params[‘alias’]);
  5.      }
  6.      // и так далее
  7. ];
  8. foreach (array_keys($this->params) as $param) {
  9.     $func = $filters[$param];
  10.     $func();
  11. }
 

Дюран

Советую разрабатывать с полностью включенным выводом варнингов и нотисов.
Просто так проверять:

Код (Text):
  1. if($this->params[‘category’]) {

нотис будет выдавать

 

Nubcoder32

Не будет)

По идее не должен, или я что-то упускаю?

PHP:
  1. protected $params = [
  2.     ‘forSale’ => false,
  3.     ‘category’ => false,
  4.     ‘categoryArray’ => false,
  5.     ‘rand’ => false,
  6.     ‘content’ => false,
  7.     ‘limit’ => false,
  8.     ‘alias’ => false,
  9.     ‘gallery’ => false
  10. ];
  11.  
  12. public function select($params){
  13.     // Загрузить параметры
  14.     foreach ($params as $k => $v){$this->params[$k] = $v;}
  15.    
  16. }
 

mkramer

В таком, как у вас — не будет. Вы просто не показали в первый раз, что у вас всё прединициализировано

 

Nubcoder32

спс, а то я новичек совсем)

 

Nubcoder32

Все, что пришло в голову, что бы упростить
1. Сделал функцию у базовой модели (ее наследуют другие модели)

PHP:
  1. public function queryBilder($bins, $value = false){
  2.     $this->requestParam .= ‘ ‘.$bins;
  3.     if($value !== false){
  4.         $this->requestParam .‘ = ?’;
  5.         array_push($this->requestAtr, $value);
  6.     }
  7. }

И в итоге получилось немного упростить

PHP:
  1.        
  2.         !$this->params[‘alias’] ?: $this->queryBilder(‘alias’, $this->params[‘alias’]);
  3.         !$this->params[‘category’] ?: $this->queryBilder(‘category_id’, $params[‘category’]);
  4.        

Вопрос 1) Можно ли писать на подобии !$this->params[‘alias’] ?: … и можно ли еще упростить, что бы убрать ! перед $this->params[‘alias’]

 

mkramer

@Nubcoder32, цикл foreach, функция array_keys

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *