php搜索关键字,可以多个

在数据库里有某个字段,想要通过多个关键字来查找出来,方法有很多种,但是我觉得这种挺好用的,如果你也这么认为,不妨试一试

最终效果

    

文具/办公室>文具/学校用品>刀/剪刀>剪刀/安全剪刀>粉红色剪刀
厨房用具>刀/剪刀/菜板>刀套装

 

贴代码:

public function search_category_name($name)
{
//$name 传入的关键字,可以多个
$key = str_replace([',', ',', "'", '/', '-', '<', '>', '》', '’'], ' ', trim($name));
$key = preg_replace('/\s+/', ' ', $key);


$arr = array_unique( explode(' ', strtolower($key)) );

//这里的话是想要查询的字段,可以多个,但是需要稍微修改一下下面的代码(假设看的懂的话),我这里只对一个字段操作
$fields = array('name_path_zh');
$weight = array(5, 2);

//开始算法
$clause = $keyweight = [];
foreach($arr as $kw){
foreach($fields as $i=>$fd){
$clause[] = " `{$fd}` LIKE '%{$kw}%' ";
$keyweight[] = sprintf(" IF(LOCATE('%s', `%s`), %d, 0) ", $kw, $fd, $weight[$i]);
$keyweight[] = sprintf(" IF(`%s` REGEXP '[[:<:]]%s[[:>:]]', %d, 0) ", $fd, $kw, $weight[$i] * 5);
if($i == 0)
{
$keyweight[] = sprintf(" IF(STRCMP(LOWER(`%s`), LOWER('%s')), 0, %d) ", $fd, $kw, $weight[$i] * 10);
}
}
}
//要显示的字段
$field = sprintf('category_id,name_path_zh as name_path,(%s) AS score', implode('+', $keyweight));
//查询的条件
$where = sprintf('(%s) AND is_delete=0 AND is_last=1', implode('OR', $clause));

//这个是CI封装的模型方法 对应的参数是:条件,字段,排序,表名,limit
$result = $this->coupang_category_model->getAll($where,$field,'score DESC','',15);
//给对应的关键字添加<i>标签
foreach($result as &$val){
$val['id_css'] = $val['name_path'];
foreach($arr as $kw){
if(strtolower($kw) == 'i') continue;
$val['id_css'] = str_ireplace($kw, sprintf('<i>%s</i>', $kw), $val['id_css']);
}
unset($val['score']);
}
return $result;
}


我输入的是“剪刀”最后的结果是

 

 那么问题来了<i>标签有什么用呢,可以让前端通过这个标签标红,这样效果就达到啦,如一开始的图。

 
posted @ 2020-09-04 14:25  郑筱筱  阅读(673)  评论(0)    收藏  举报