在数据库里有某个字段,想要通过多个关键字来查找出来,方法有很多种,但是我觉得这种挺好用的,如果你也这么认为,不妨试一试
最终效果
文具/办公室>文具/学校用品>刀/剪刀>剪刀/安全剪刀>粉红色剪刀
厨房用具>刀/剪刀/菜板>刀套装
贴代码:
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