aljajazva

php apartment filter

Sep 28th, 2020
750
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2.  
  3. class Filters
  4. {
  5.     //метаинформация для построения отображения фильтров на странице
  6.     public $db;
  7.     public $filters_number_of_rooms;
  8.     public $filters_floor;
  9.     public $filters_section;
  10.     public $filters_section_id;
  11.     public $section_stage;
  12.     public $filters_area;
  13.     public $filters_area_min;
  14.     public $filters_area_max;
  15.     public $filters_stage;
  16.     public $filters_stage_id;
  17.     public $filters_price;
  18.     public $filters_price_min;
  19.     public $filters_price_max;
  20.  
  21.     public $apartments = null;
  22.  
  23.     public function __construct($db)
  24.     {
  25.         $this->db = $db;
  26.     }
  27.  
  28.     //извлечение всех квартир
  29.     public function all_apartments($area_sort = 'ASC') {
  30.         if (!is_null($this->apartments) && ($area_sort = 'ASC')) {
  31.             return $this->apartments;
  32.         }
  33.         $all_apartments = array();
  34.         $this->db->execute("SELECT `rnbw_apartments`.*,
  35.                                   `rnbw_sections`.`id_stage` AS id_stage,
  36.                                   `rnbw_sections`.`name` AS section_name,
  37.                                   `rnbw_sections`.`id_stage` AS section_stage,
  38.                                   `rnbw_stage`.`name` AS stage_name,
  39.                                   `rnbw_floors`.`floors_num` AS floor_number,
  40.                                   `rnbw_floors`.`name` AS floor_name,
  41.                                   `rnbw_floors`.`annotation` AS floor_name_pretty
  42.                            FROM `rnbw_apartments`                            
  43.                            LEFT JOIN `rnbw_sections`
  44.                              ON `rnbw_apartments`.`id_section` = `rnbw_sections`.`id`
  45.                            LEFT JOIN `rnbw_floors`
  46.                              ON `rnbw_apartments`.`id_floor` = `rnbw_floors`.`id`
  47.                            LEFT JOIN `rnbw_stage`
  48.                              ON `rnbw_sections`.`id_stage` = `rnbw_stage`.`id`
  49.                            WHERE `pstatus`='free'
  50.                              AND `is_non_residential` IS NULL
  51.                            ORDER BY `rnbw_apartments`.`total_area` * 1 {$area_sort}");
  52.         if (isset($this->db->data[0])) {
  53.             foreach ($this->db->data as $one){
  54.                 $all_apartments[] = new PrettyApartment($one);
  55.             }
  56.             //строим фильтры
  57.             //Очередь
  58.             $this->filters_stage_id = array_unique(array_column($this->db->data, 'id_stage'));
  59.             ksort($this->filters_stage_id);
  60.             $this->filters_stage = array_unique(array_column($this->db->data, 'stage_name'));
  61.             ksort($this->filters_stage);
  62.             $this->filters_stage = array_combine($this->filters_stage_id, $this->filters_stage);
  63.  
  64.             //секции
  65.             //связь между секцией и очередью
  66.             $stage_id = array_column($this->db->data, 'id_stage');
  67.             ksort($stage_id);
  68.             $section_id = array_column($this->db->data, 'id_section');
  69.             ksort($section_id);
  70.             $this->section_stage = array_combine ($section_id, $stage_id);
  71.  
  72.             $this->filters_section_id = array_unique(array_column($this->db->data, 'id_section'));
  73.             ksort($this->filters_section_id);
  74.             $this->filters_section = array_unique(array_column($this->db->data, 'section_name'));
  75.             ksort($this->filters_section);
  76.             $this->filters_section = array_combine($this->filters_section_id, $this->filters_section);
  77.  
  78.  
  79.             //Этажи
  80.             $this->filters_floor = array_unique(array_column($this->db->data, 'floor_number'));
  81.             ksort($this->filters_floor);
  82.             $this->filters_floor = max($this->filters_floor);
  83.  
  84.             //к-во комнат
  85.             $this->filters_number_of_rooms = array(
  86.                 6 => 'Студия',
  87.                 1 => '1 комнатная',
  88.                 2 => '2 комнатная',
  89.                 3 => '3 комнатная',
  90.                 4 => 'Кладовки',
  91.                 5 => 'Коммерческая недвижимость',
  92.             );
  93.  
  94.             //площадь
  95.             $this->filters_area = array_column($this->db->data, 'total_area');
  96.             array_walk($this->filters_area, function (&$item) { $item = floatval(str_replace(',', '.', $item)); });
  97.             ksort($this->filters_area);
  98.             $this->filters_area_min = floor(min($this->filters_area));
  99.             $this->filters_area_max = ceil(max($this->filters_area));
  100.  
  101.             //цена
  102.             $this->filters_price = array_unique(array_column($this->db->data, 'price'));
  103.             $this->filters_price = array_filter($this->filters_price, function ($price){
  104.                 return !is_null($price);
  105.             });
  106.             ksort($this->filters_price);
  107.             if (!empty($this->filters_price)){
  108.                 $this->filters_price_min = floor(min($this->filters_price));
  109.                 $this->filters_price_max = ceil(max($this->filters_price));
  110.             } else{
  111.                 $this->filters_price_min = $this->filters_price_max = 0;
  112.             };
  113.  
  114.  
  115.         }
  116.         $this->apartments = $all_apartments;
  117.  
  118.         return $all_apartments;
  119.     }
  120.  
  121.     //извлечение квартир по ключам
  122.     public function filter_apartment($filter_keys) {
  123.         if (is_null($this->apartments)) {
  124.             $this->all_apartments();
  125.         }
  126.         //определение значений различных ключей
  127.         $filtered_list_of_apartments = array_filter($this->apartments, function($apartment) use (&$filter_keys) {
  128.             foreach ($filter_keys as $key => $key_value) {
  129.                 if (!isset($apartment->{$key})){
  130.                    return false;
  131.                 }
  132.                 if (in_array($key, array('stage', 'number_rooms'))) {
  133.                     if ((implode($key_value, '') != '') && !in_array($apartment->{$key}, $key_value)) {
  134.                         return false;
  135.                     }
  136.                 } else if ($key == 'section') {
  137.                     if (!in_array($apartment->section_id, $key_value)) {
  138.                         return false;
  139.                     }
  140.                 } else {
  141.                     array_walk($key_value, function (&$item) { $item = floatval(str_replace(',', '.', $item)); });
  142.                     $min = min($key_value);
  143.                     $max = max($key_value);
  144.                     $actual_value = floatval(str_replace(',', '.', $apartment->{$key}));
  145.                     if (($min > $actual_value) || ($actual_value > $max)) {
  146.                         return false;
  147.                     }
  148.                 }
  149.             }
  150.             return true;
  151.         });
  152.         return $filtered_list_of_apartments;
  153.     }
  154.  
  155. }
  156.  
  157.  
  158. <?php
  159.  
  160. class PrettyApartment
  161. {
  162.  public $id;
  163.  public $apartment_number;
  164.  public $number_of_rooms;
  165.  public $number_rooms;
  166.  public $floor_id;
  167.  public $floor_number;
  168.  public $floor;//floors_num поле в базе
  169.  public $floor_name_pretty;
  170.  public $stage_id;
  171.  public $stage;
  172.  public $section_id;
  173.  public $section;
  174.  public $total_area;
  175.  public $price;
  176.  public $apartment_url;
  177.  protected $plan;
  178.  
  179.     public function __construct($raw_apartment)
  180.     {
  181.         $this->id = $raw_apartment['id'];
  182.         $this->number_rooms = $raw_apartment['number_rooms'];
  183.         switch ($raw_apartment['number_rooms']){
  184.             case 6:
  185.                 $this->number_of_rooms = 'Студия';
  186.                 break;
  187.             case 1:
  188.                 $this->number_of_rooms = '1 комната';
  189.                 break;
  190.             case 2:
  191.                 $this->number_of_rooms = '2 комнаты';
  192.                 break;
  193.             case 3:
  194.                 $this->number_of_rooms = '3 комнаты';
  195.                 break;
  196.             case 4:
  197.                 $this->number_of_rooms = 'Кладовки';
  198.                 break;
  199.             case 5:
  200.                 $this->number_of_rooms = 'Коммерческая недвижимость';
  201.                 break;
  202.         };
  203.  
  204.  
  205.         $this->apartment_number = $raw_apartment['num_apartment'];
  206.         $this->total_area = $raw_apartment['total_area'];
  207.         $this->plan = $raw_apartment['visualization'];
  208.         $this->price = $raw_apartment['price'];
  209.         $this->apartment_url = '/rooms/'.$raw_apartment['id'].'-room/';
  210.  
  211.         $this->floor_id = $raw_apartment['id_floor'];
  212.         $this->floor_name_pretty = $raw_apartment['floor_name_pretty'];
  213.         $this->floor = $raw_apartment['floor_name'];
  214.         $this->floor_number = $raw_apartment['floor_number'];
  215.  
  216.         $this->section_id = $raw_apartment['id_section'];
  217.         $this->section = $raw_apartment['section_name'];
  218.  
  219.         $this->stage_id = $raw_apartment['id_stage'];
  220.         $this->stage = $raw_apartment['stage_name'];
  221.     }
  222.  
  223.     public function show_apartment_plan($size) {
  224.         if ($this->plan != null){
  225.             $img = getImg($this->plan);
  226.             if (isset ($img['0'])){
  227.                 return $img['0'][$size];
  228.             }
  229.         }
  230.     }
  231.  
  232. }
RAW Paste Data