php提供一維數組模糊查詢

2019年9月30日14:36:15mysql

 提供一維數組模糊查詢,只支持utf-8 內部處理是Unicode 編碼特殊編碼格式的可能會出錯sql

 
 
if (!function_exists('arrayFuzzyQuery')) {

    /*
     * 提供一維數組value 模糊查詢,只支持utf-8 內部處理是Unicode 編碼特殊編碼格式的可能會出錯
     * 注意:此方法可能會出現處理時間過長的問題
     */

    function arrayFuzzyQuery($string, array $array = [], $key = null) {

        if (empty($string)) {
            throw new \Exception('查詢參數不能爲空');
        }
        if (empty($array)) {
            throw new \Exception('被查詢數組爲空');
        }
        $return = [];

        //指望類似度比例 100爲 100%
        $expectedRatio = 50;

        //同時使用全對比和類似度對比
        foreach ($array as $k => $v) {

            if (empty($key)) {
                similar_text($string, $v, $percent);
                if (mb_substr_count($string, $v) > 0 || $percent >= $expectedRatio) {
                    array_push($return, $v);
                }
            } else {
                similar_text($string, $v[$key], $percent);
                if (mb_substr_count($string, $v[$key]) > 0 || $percent >= $expectedRatio) {
                    array_push($return, $v);
                }
            }
        }
        return $return;
    }

}
 
 

 

 

 注意: similar_text對英文支持效果好一點,中文對比效果差一點,根據實際業務須要 50%這個比例須要調整,通過幾輪測試,效果還能夠,基本夠用,不嫌麻煩就添加到mysql數據庫使用like OR elasticsearch 數據庫

 

測試數據數組

  $string = '水果西瓜';

        $arrays = array(
            '0' => array('id' => 1, 'pid' => 0, 'name' => '水果'),
            '1' => array('id' => 2, 'pid' => 0, 'name' => '蔬菜'),
            '2' => array('id' => 3, 'pid' => 1, 'name' => '食品'),
            '3' => array('id' => 4, 'pid' => 2, 'name' => '運動'),
            '4' => array('id' => 5, 'pid' => 1, 'name' => '電腦'),
            '5' => array('id' => 6, 'pid' => '香果', 'name' => '香蕉'),
            '6' => array('id' => 7, 'pid' => 4, 'name' => '牛奶'),
            '7' => array('id' => 8, 'pid' => 5, 'name' => '西瓜'),
            '8' => array('id' => 9, 'pid' => 7, 'name' => '蘋果'),
        );
//        $rr = CommonService::getWarehouse($string, $arrays);
        $rr = arrayFuzzyQuery($string, $arrays, 'name');
        pp($rr);
相關文章
相關標籤/搜索