一维或二维数组 根据关键字 对 数组字段 进行相似度排序

2021-01-07  本文已影响0人  华仔233

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);
}
3.2、二维数组
public function test()
{
    $arr = [
        ['a'=>'你好'],
        ['a'=>'你在干嘛'],
        ['a'=>'你好吗'],
        ['a'=>'你好好'],
        ['a'=>'你在吗'],
        ['a'=>'你你你'],
    ];
    $arr1 = similarArrSort($arr,'你好','a');
    ddd($arr1);
}
上一篇下一篇

猜你喜欢

热点阅读