1、思想實現
- 其中主要運用PHP的方法
similar_text($field,$keyword,$percent)
,其中$field
是對應的值,$keyword
是對比的值,$percent
是相似度值(0~1) - 一維二維數組對比完之後根據相似度的值進行排序,然後去除該字段返回。
2、代碼實現
/**
* 一維/二維數組根據關鍵字對數組字段進行相似度排序
* @param array $array 原數組
* @param string $keyword 關鍵字
* @param string $field 要匹配的數組字段名,不傳則表示一維數組
* @param int $limit 限制次數,-1不限制
* @return array 排序好的數組
*/
function similarArrSort(array $array, string $keyword, $field = '', $limit = -1)
{
//數組key小於2,直接返回,不符合排序要求(特例,可不寫)
if (count($array) <= 1 || ($limit != -1 && $limit <= 1)) {
return $array;
}
$newField = $field; //賦值
//如果傳入的field爲空則表示一維數組,生成field爲label的二維數組
if ($field == '') {
$label2 = [];
foreach ($array as $k => $value) $label2[$k]['label'] = $value;
$array = $label2;
$newField = 'label';
}
//數組相似度處理
foreach ($array as $key => $value) {
similar_text($value[$newField], $keyword, $percent);
$value['percent'] = $percent;
$data[] = $value;
}
//取出數組中percent的一列,返回一維數組
$percent = array_column($data, 'percent');
//排序,根據 percent 排序
array_multisort($percent, SORT_DESC, $data);
//一維數組處理返回一維數組
if ($field == '') {
$newData = [];
foreach ($data as $k => $v) $newData[$k] = $v[$newField];
$data = $newData;
}
//限制返回數量
if ($limit != -1) {
$data = array_slice($data, 0, $limit);
}
return $data;
}
3、測試代碼
3.1、一維數組
public function test()
{
$arr = [2,3,15,23,44,25,66,231,566,246,255,656];
$arr1 = similarArrSort($arr,55);
ddd($arr1);
}
-
返回的效果圖如下,關鍵詞是55。
3.2、二維數組
public function test()
{
$arr = [
['a'=>'你好'],
['a'=>'你在幹嘛'],
['a'=>'你好嗎'],
['a'=>'你好好'],
['a'=>'你在嗎'],
['a'=>'你你你'],
];
$arr1 = similarArrSort($arr,'你好','a');
ddd($arr1);
}
-
返回的效果圖如下,關鍵詞是你好,對應比較字段是a。