|
@@ -11,6 +11,7 @@ namespace search;
|
|
|
use algorithm;
|
|
|
use brand_helper;
|
|
|
use category_helper;
|
|
|
+use Log;
|
|
|
|
|
|
function mb_str_split( $string ) {
|
|
|
return preg_split('/(?<!^)(?!$)/u', $string );
|
|
@@ -209,9 +210,88 @@ class goods_dict extends words
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+class goods_info
|
|
|
+{
|
|
|
+ private $mGoods;
|
|
|
+ public function __construct()
|
|
|
+ {
|
|
|
+ $this->mGoods = [];
|
|
|
+ }
|
|
|
+
|
|
|
+ public function add($commonid, $price, $click, $salenum)
|
|
|
+ {
|
|
|
+ $commonid = intval($commonid);
|
|
|
+ if(!array_key_exists($commonid,$this->mGoods)) {
|
|
|
+ $this->mGoods[$commonid]['price'] = intval($price * 100 + 0.5);
|
|
|
+ $this->mGoods[$commonid]['click'] = intval($click);
|
|
|
+ $this->mGoods[$commonid]['salenum'] = intval($salenum);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public function goods($commonid)
|
|
|
+ {
|
|
|
+ return $this->mGoods[$commonid];
|
|
|
+ }
|
|
|
+
|
|
|
+ static public function click_asc($left,$right)
|
|
|
+ {
|
|
|
+ $t_l = intval($left['click']);
|
|
|
+ $t_r = intval($right['click']);
|
|
|
+
|
|
|
+ if($t_l > $t_r) return 1;
|
|
|
+ elseif($t_l < $t_r) return -1;
|
|
|
+ else return 0;
|
|
|
+ }
|
|
|
+ static public function click_desc($left,$right)
|
|
|
+ {
|
|
|
+ $t_l = intval($left['click']);
|
|
|
+ $t_r = intval($right['click']);
|
|
|
+
|
|
|
+ if($t_l > $t_r) return -1;
|
|
|
+ elseif($t_l < $t_r) return 1;
|
|
|
+ else return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ static public function salenum_asc($left,$right)
|
|
|
+ {
|
|
|
+ $t_l = intval($left['salenum']);
|
|
|
+ $t_r = intval($right['salenum']);
|
|
|
+
|
|
|
+ if($t_l > $t_r) return 1;
|
|
|
+ elseif($t_l < $t_r) return -1;
|
|
|
+ else return 0;
|
|
|
+ }
|
|
|
+ static public function salenum_desc($left,$right)
|
|
|
+ {
|
|
|
+ $t_l = intval($left['salenum']);
|
|
|
+ $t_r = intval($right['salenum']);
|
|
|
+
|
|
|
+ if($t_l > $t_r) return -1;
|
|
|
+ elseif($t_l < $t_r) return 1;
|
|
|
+ else return 0;
|
|
|
+ }
|
|
|
+ static public function price_asc($left,$right)
|
|
|
+ {
|
|
|
+ $t_l = intval($left['price']);
|
|
|
+ $t_r = intval($right['price']);
|
|
|
+
|
|
|
+ if($t_l > $t_r) return 1;
|
|
|
+ elseif($t_l < $t_r) return -1;
|
|
|
+ else return 0;
|
|
|
+ }
|
|
|
+ static public function price_desc($left,$right)
|
|
|
+ {
|
|
|
+ $t_l = intval($left['price']);
|
|
|
+ $t_r = intval($right['price']);
|
|
|
+
|
|
|
+ if($t_l > $t_r) return -1;
|
|
|
+ elseif($t_l < $t_r) return 1;
|
|
|
+ else return 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
class searcher
|
|
|
{
|
|
|
- const filter = "goods_commonid,gc_id,brand_id,goods_mobile_name,goods_jingle,goods_spec";
|
|
|
+ const filter = "goods_commonid,gc_id,brand_id,goods_mobile_name,goods_jingle,goods_spec,goods_click,goods_salenum,goods_price";
|
|
|
|
|
|
private $name_dict;
|
|
|
private $jingle_dict;
|
|
@@ -221,6 +301,9 @@ class searcher
|
|
|
private $category_dict;
|
|
|
private $goods_dict;
|
|
|
|
|
|
+ private $goods_info;
|
|
|
+ private $price_cids;
|
|
|
+
|
|
|
private static $stInstance;
|
|
|
|
|
|
public static function instance()
|
|
@@ -255,6 +338,8 @@ class searcher
|
|
|
$this->jingle_dict = new words();
|
|
|
$this->spec_dict = new words();
|
|
|
$this->goods_dict = new goods_dict();
|
|
|
+ $this->goods_info = new goods_info();
|
|
|
+ $this->price_cids = new valtokey();
|
|
|
|
|
|
$mod_goods = Model('goods');
|
|
|
$items = $mod_goods->getGoodsOnlineList(array(), self::filter, '', '', false);
|
|
@@ -280,7 +365,11 @@ class searcher
|
|
|
$this->brand_dict->add_brand($brand_id,$common_id,$hot_id);
|
|
|
$this->goods_dict->add_goods($common_id,$brand_id,$hot_id);
|
|
|
$this->category_dict->add_hot($hot_id,$brand_id,$common_id);
|
|
|
+
|
|
|
+ $this->goods_info->add($common_id,$item['goods_price'],$item['goods_click'],$item['goods_salenum']);
|
|
|
+ $this->price_cids->add($common_id,intval($item['goods_price'] * 100 + 0.5));
|
|
|
}
|
|
|
+ $this->price_cids->finish();
|
|
|
}
|
|
|
|
|
|
private function get_name($dict, $words)
|
|
@@ -486,10 +575,111 @@ class searcher
|
|
|
}
|
|
|
|
|
|
if(isset($keyword) && !empty($keyword)) {
|
|
|
- return $this->keyword_serarch($keyword,$hot,$brand);
|
|
|
+ $result = $this->keyword_serarch($keyword,$hot,$brand);
|
|
|
} else {
|
|
|
- return $this->hb_search($hot,$brand);
|
|
|
+ $result = $this->hb_search($hot,$brand);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!empty($result))
|
|
|
+ {
|
|
|
+ $order = $params['order'];
|
|
|
+ $sort = $params['sort'];
|
|
|
+
|
|
|
+ $page_count = 1;
|
|
|
+ if(!isset($params['page_no'])) {
|
|
|
+ $page_no = null;
|
|
|
+ } else {
|
|
|
+ $page_no = $params['page_no'];
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!isset($params['page_size'])) {
|
|
|
+ $page_size = null;
|
|
|
+ } else {
|
|
|
+ $page_size = intval($params['page_size']);
|
|
|
+ $page_size = $page_size <= 0 ? 10 : $page_size;
|
|
|
+ $page_count = intval(count($result['cids']) / $page_size) + ((count($result['cids']) % $page_size) == 0 ? 0 : 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ $cids = $this->sort_goods($result['cids'],$order,$sort,$page_no,$page_size);
|
|
|
+ $result['cids'] = $cids;
|
|
|
+ $result['page_count'] = $page_count;
|
|
|
}
|
|
|
+
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private function sort_goods($cids,$order,$sort,$page_no,$page_size)
|
|
|
+ {
|
|
|
+ $goods = [];
|
|
|
+ foreach ($cids as $cid) {
|
|
|
+ $val = $this->goods_info->goods($cid);
|
|
|
+ $val['cid'] = $cid;
|
|
|
+ $goods[] = $val;
|
|
|
+ }
|
|
|
+
|
|
|
+ if($sort == 'asc')
|
|
|
+ {
|
|
|
+ if($order == 'cilck') {
|
|
|
+ uasort($goods,['\search\goods_info','click_asc']);
|
|
|
+ }
|
|
|
+ elseif($order == 'salenum') {
|
|
|
+ uasort($goods,['\search\goods_info','salenum_asc']);
|
|
|
+ }
|
|
|
+ elseif($order == 'price') {
|
|
|
+ uasort($goods,['\search\goods_info','price_asc']);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ Log::record("searcher sort_goods not order param");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if($order == 'cilck') {
|
|
|
+ uasort($goods,['\search\goods_info','click_desc']);
|
|
|
+ }
|
|
|
+ elseif($order == 'salenum') {
|
|
|
+ uasort($goods,['\search\goods_info','salenum_desc']);
|
|
|
+ }
|
|
|
+ elseif($order == 'price') {
|
|
|
+ uasort($goods,['\search\goods_info','price_desc']);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ Log::record("searcher sort_goods not order param");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $tmp = [];
|
|
|
+ foreach ($goods as $val) {
|
|
|
+ $tmp[] = $val;
|
|
|
+ }
|
|
|
+ $goods = $tmp;
|
|
|
+
|
|
|
+ $count = count($goods);
|
|
|
+ $result = [];
|
|
|
+ if($page_no == null || $page_size == null)
|
|
|
+ {
|
|
|
+ foreach ($goods as $val) {
|
|
|
+ $result[] = $val['cid'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ $page_no = $page_no <= 0 ? 1 : $page_no;
|
|
|
+ for ($start = ($page_no -1) * $page_size; $page_size > 0 && $start < $count; $page_size--,$start++) {
|
|
|
+ $result[] = $goods[$start]['cid'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ public function match_price($params)
|
|
|
+ {
|
|
|
+ $price = $params['price'];
|
|
|
+ $page_no = $params['page_no'];
|
|
|
+ $page_size = $params['page_size'];
|
|
|
+
|
|
|
+ return $this->price_cids->findless(intval($price * 100 + 0.5),$page_no,$page_size);
|
|
|
}
|
|
|
|
|
|
private function get_ids($dict, $words)
|