if (preg_match("/[:]/", $pos[$prop['posid']])) { continue; } if (!Xlsx::isSpecified($pos[$prop['posid']])) { continue; } $r = false; if ($prop['separator']) { $arval = explode($prop['separator'], $pos[$prop['posid']]); } else { $arval = array($pos[$prop['posid']]); } foreach ($arval as $i => $value) { $idi = Path::encode($value); $id = mb_strtolower($idi); if (!Xlsx::isSpecified($id)) { continue; } $r = true; $params[$k]['option'][$idi]['filter']++; } if ($r) { $params[$k]['filter']++; } //Позиций с этим параметром } } //У скольки позиций в выборке у которых этот параметр не указан $params[$k]['nofilter'] = sizeof($poss) - $params[$k]['filter']; // }
public static function option($values, $count, $search, $showhard = false) { foreach ($values as $value => $s) { break; } $opt = array('type' => '', 'values' => $values); $min = $value; $max = $value; $yes = 0; $yesall = 0; /* $values массив со всеми возможными занчениями каждого параметра каждое значение характеризуется count - сколько всего в текущем разделе, определяющего набор фильтров search - сколько всего найдено с md filter - сколько найдено если данный параметр не указана в md */ foreach ($opt['values'] as $v => $c) { if (Xlsx::isSpecified($v)) { $yes += $c['search']; //Сколько найдено $yesall += $c['count']; //Сколько в группе } } $opt['search'] = $yes; $opt['count'] = $yesall; if (!$showhard && $count > $yesall * 10) { //Если отмеченных менее 10% то такие опции не показываются return false; } $type = false; foreach ($opt['values'] as $val => $c) { //Слайдер if (is_string($val)) { $type = 'string'; break; } if ($val < $min) { $min = $val; } if ($val > $max) { $max = $val; } } if (!$type) { $len = sizeof($opt['values']); if ($len > 5) { //Слайдер $opt['min'] = $min; $opt['max'] = $max; $type = 'slider'; unset($opt['values']); } else { $type = 'string'; } } $opt['type'] = $type; if ($opt['type'] == 'string') { $saved_values = $opt['values']; if (sizeof($opt['values']) > 30) { $opt['values'] = array(); if (!$showhard) { return false; } } if ($showhard) { foreach ($showhard as $show => $one) { $title = $show; //$show = mb_strtolower($show); if ($show == 'yes') { continue; } if ($show == 'no') { continue; } if ($opt['values'][$show]) { continue; } $opt['values'][$show] = $saved_values[$show]; //array('id'=>$show, 'title'=>$title); } } /*foreach($opt['values'] as $v){//Когда всех значений по 1 if($v!=1){ //Единичные опции $opt['values']=array(); break; } }*/ //if(sizeof($opt['values'])>10){ //$opt['values_more']=array_slice($opt['values'],6,sizeof($opt['values'])-6,true); //$opt['values']=array_slice($opt['values'],0,6,true); //} } if ($opt['type'] == 'string') { usort($opt['values'], function ($v1, $v2) { //if ($v1['filter']>$v2['filter']) return -1; //if ($v1['filter']<$v2['filter']) return 1; if ($v1['count'] > $v2['count']) { return -1; } if ($v1['count'] < $v2['count']) { return 1; } }); } /*if(sizeof($opt['values'])==1){ if($opt['yes']==$count){//Значение есть у всех позиций и только один вариант unset($params[$k]); continue; } }*/ if (!$opt['values'] && $opt['type'] != 'slider') { if ($opt['count'] == $count) { //Слишком много занчений но при этом у всех позиций они указаны и нет no yes return false; } } $opt['nosearch'] = $search - $opt['search']; //из общего количества вычесть количество указанных $opt['nocount'] = $count - $opt['count']; //из общего количества вычесть количество с yes return $opt; }