第一次听老板说这种需求,第一感觉就是离谱,没办法,硬着头皮上
基本思路是将文字拆分成单独的一个个文字,然后使用数学上的排列组合,将可能得结果都组合出来,再循化模糊查询,将最全字匹配的放最上面,单字的放最下面。
function keywords_zh($array,$level = -1,&$list =[]){
for ($i=0; $i < count($array); $i++) {
if($level < 0){
//第一级直接输出对应数字
$list[] = $array[$i];
}else{
$values = $array[$i];
//根据等级组装前几位
$values=[];
for ($k=0; $k < $level ; $k++) {
$values[] = $array[$i+$k+1];
}
$j= 0;
//循环拼合最后一位
for ($n=($i+$level+1); $n < count($array); $n++) {
$j++;
$first[] = $values; // 组合上几位
$first[]= $array[$n];
$list[] = $first;
}
//到最后一位结束递归
if($j == 1){
break;
}
}
}
//长度大于等级+2停止递归
if(($level+2) < count($array)){
keywords_zh($array,$level+1,$list);
}
return $list;
}
$keyword_arr = str_caifen($keyword);
$new_arr_get = keywords_zh($keyword_arr);
// var_dump($new_arr_get);
// exit;
foreach ($new_arr_get as $k => $item){
$res1[] = db('new_property')
->field('id,name')
->where("trim(replace(name,'·','')) like trim(replace('%".$item."%',' ','')) AND xiansuo =0")
->select();
}
//降维
$result1 = array_reduce($res1, 'array_merge', array());
//去重
$data[$key] = ArrayUnique($result1);
//拆分
function str_caifen($str){
if(!$str){
return false;
}
return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}