where('first','<>','')->field('id,name,merge_name,pid')->order('sorts asc,id asc')->select()->toArray(); foreach ($area_list as &$vo) { $vo['field'] = self::get_first_char($vo['name']); } $arr = self::array_group_by($area_list, 'field'); ksort($arr); $citys = array(); foreach ($arr as $keys=>$vo){ $citys[] = ['key'=>$keys,'list'=>$vo]; } ksort($citys); //获取热门城市 $map['id'] = ['in','1710']; $hot_list = PostageRegion::cache(true,1)->where($map)->field('id,pid,name,merge_name')->order('first asc')->select()->toArray(); $list = ['hot_list'=>$hot_list,'city_list'=> $citys]; return $list; } /** * 获取定位信息 * @param $params * @return false|mixed|void */ public static function getLocation($params) { try { $location = $params['latitude'].','.$params['longitude']; $key = 'SEGBZ-P3PK6-CU5SB-MQLQP-ZDPJS-PHFR6'; $url = 'https://apis.map.qq.com/ws/geocoder/v1/?location=' . $location . '&key='.$key.'&get_poi=1'; $result = http_request($url); if(empty($result)){ throw new Exception('定位请求失败'); } if ($result['status'] === 0) { //获取城市id if(empty($result['result']['address_component']['city'])){ throw new Exception('定位获取shibai'); } $city_id = PostageRegion::where('name','like',"%".$result['result']['address_component']['city']."%")->value('id'); $result = $result['result']['address_component']; $result['city_id'] = $city_id; $result['merge_name'] = implode(',',[$result['province'],$result['city'],$result['district']]); return $result; } } catch (\Exception $e) { self::$error = $e->getMessage(); return false; } } public static function get_first_char($s) { $s0 = mb_substr(self::my_trim($s), 0, 1); //获取名字的姓 try { $s = iconv('UTF-8', 'GB2312', $s0); //将UTF-8转换成GB2312编码 } catch (\Exception $e) { return 'Z#'; } if (ord($s0) > 128) { //汉字开头,汉字没有以U、V开头的 $asc = ord($s[0]) * 256 + ord($s[1]) - 65536; if ($asc >= -20319 and $asc <= -20284) return "A"; if ($asc >= -20283 and $asc <= -19776) return "B"; if ($asc >= -19775 and $asc <= -19219) return "C"; if ($asc >= -19218 and $asc <= -18711) return "D"; if ($asc >= -18710 and $asc <= -18527) return "E"; if ($asc >= -18526 and $asc <= -18240) return "F"; if ($asc >= -18239 and $asc <= -17760) return "G"; if ($asc >= -17759 and $asc <= -17248) return "H"; if ($asc >= -17247 and $asc <= -17418) return "I"; if ($asc >= -17417 and $asc <= -16475) return "J"; if ($asc >= -16474 and $asc <= -16213) return "K"; if ($asc >= -16212 and $asc <= -15641) return "L"; if ($asc >= -15640 and $asc <= -15166) return "M"; if ($asc >= -15165 and $asc <= -14923) return "N"; if ($asc >= -14922 and $asc <= -14915) return "O"; if ($asc >= -14914 and $asc <= -14631) return "P"; if ($asc >= -14630 and $asc <= -14150) return "Q"; if ($asc >= -14149 and $asc <= -14091) return "R"; if ($asc >= -14090 and $asc <= -13319) return "S"; if ($asc >= -13318 and $asc <= -12839) return "T"; if ($asc >= -12838 and $asc <= -12557) return "W"; if ($asc >= -12556 and $asc <= -11848) return "X"; if ($asc >= -11847 and $asc <= -11056) return "Y"; if ($asc >= -11055 and $asc <= -10247) return "Z"; } else if (ord($s) >= 48 and ord($s) <= 57) { //数字开头 switch (iconv_substr($s, 0, 1, 'utf-8')) { case 1: return "Y"; case 2: return "E"; case 3: return "S"; case 4: return "S"; case 5: return "W"; case 6: return "L"; case 7: return "Q"; case 8: return "B"; case 9: return "J"; case 0: return "L"; } } else if (ord($s) >= 65 and ord($s) <= 90) { //大写英文开头 return substr($s, 0, 1); } else if (ord($s) >= 97 and ord($s) <= 122) { //小写英文开头 return strtoupper(substr($s, 0, 1)); } else { return iconv_substr($s0, 0, 1, 'utf-8');//中英混合的词语,不适合上面的各种情况,因此直接提取首个字符即可 } } public static function array_group_by($arr, $key) { $grouped = array(); foreach ($arr as $value) { $grouped[$value[$key]][] = $value; } if (func_num_args() > 2) { $args = func_get_args(); foreach ($grouped as $key => $value) { $parms = array_merge($value, array_slice($args, 2, func_num_args())); $grouped[$key] = call_user_func_array('array_group_by', $parms); } } return $grouped; } public static function my_trim($str) { $search = array(" ", " ", "\n", "\r", "\t"); $replace = array("", "", "", "", ""); return str_replace($search, $replace, $str); } }