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);