197 lines
6.0 KiB
PHP
Executable File
197 lines
6.0 KiB
PHP
Executable File
<?php
|
||
// +----------------------------------------------------------------------
|
||
// | likeshop开源商城系统
|
||
// +----------------------------------------------------------------------
|
||
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
|
||
// | gitee下载:https://gitee.com/likeshop_gitee
|
||
// | github下载:https://github.com/likeshop-github
|
||
// | 访问官网:https://www.likeshop.cn
|
||
// | 访问社区:https://home.likeshop.cn
|
||
// | 访问手册:http://doc.likeshop.cn
|
||
// | 微信公众号:likeshop技术社区
|
||
// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
|
||
// | likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
|
||
// | 禁止对系统程序代码以任何目的,任何形式的再发布
|
||
// | likeshop团队版权所有并拥有最终解释权
|
||
// +----------------------------------------------------------------------
|
||
// | author: likeshop.cn.team
|
||
// +----------------------------------------------------------------------
|
||
|
||
namespace app\common\logic;
|
||
|
||
|
||
use app\common\model\city\City;
|
||
use app\common\model\Region;
|
||
|
||
class RegionLogic extends BaseLogic
|
||
{
|
||
/**
|
||
* @notes 地区
|
||
* @return array
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\DbException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @author ljj
|
||
* @date 2022/4/6 10:51 上午
|
||
*/
|
||
public function region($params)
|
||
{
|
||
$where = [];
|
||
if(isset($params['keyword']) && $params['keyword']){
|
||
$where[] = ['name','like','%'.$params['keyword'].'%'];
|
||
}
|
||
$lists = Region::where($where)->field('id,parent_id,level,name,short,city_code,zip_code,gcj02_lng,gcj02_lat,db09_lng,db09_lat,remark1,remark2')->select()->toArray();
|
||
|
||
$lists = linear_to_tree($lists,'sub','id','parent_id');
|
||
|
||
return $lists;
|
||
}
|
||
|
||
/**
|
||
* @notes 地级市列表
|
||
* @return array
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\DbException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @author ljj
|
||
* @date 2022/4/6 2:41 下午
|
||
*/
|
||
public function city($params)
|
||
{
|
||
$where = [];
|
||
$where[] = ['level','=',2];
|
||
if(isset($params['keyword']) && $params['keyword']){
|
||
$where[] = ['name','like','%'.$params['keyword'].'%'];
|
||
}
|
||
$lists = City::where($where)
|
||
->field('id,parent_id,level,name,gcj02_lng,gcj02_lat,db09_lng,db09_lat,city_id')
|
||
->select()
|
||
->toArray();
|
||
$lists = self::groupByInitials($lists);
|
||
unset($lists[null]);
|
||
|
||
return $lists;
|
||
}
|
||
|
||
|
||
/**
|
||
* 二维数组根据首字母分组排序
|
||
* @param array $data 二维数组
|
||
* @param string $targetKey 首字母的键名
|
||
* @return array 根据首字母关联的二维数组
|
||
*/
|
||
public function groupByInitials(array $data, $targetKey = 'name')
|
||
{
|
||
$data = array_map(function ($item) use ($targetKey) {
|
||
return array_merge($item, [
|
||
'initials' => $this->getInitials($item[$targetKey]),
|
||
]);
|
||
}, $data);
|
||
$data = $this->sortInitials($data);
|
||
return $data;
|
||
}
|
||
|
||
/**
|
||
* 按字母排序
|
||
* @param array $data
|
||
* @return array
|
||
*/
|
||
public function sortInitials(array $data)
|
||
{
|
||
$sortData = [];
|
||
foreach ($data as $key => $value) {
|
||
$sortData[$value['initials']][] = $value;
|
||
}
|
||
ksort($sortData);
|
||
return $sortData;
|
||
}
|
||
|
||
/**
|
||
* 获取首字母
|
||
* @param string $str 汉字字符串
|
||
* @return string 首字母
|
||
*/
|
||
public function getInitials($str)
|
||
{
|
||
if (empty($str)) {return '';}
|
||
$fchar = ord($str[0]);
|
||
if ($fchar >= ord('A') && $fchar <= ord('z')) {
|
||
return strtoupper($str[0]);
|
||
}
|
||
|
||
$s1 = iconv('UTF-8', 'GBK', $str);
|
||
$s2 = iconv('GBK', 'UTF-8', $s1);
|
||
$s = $s2 == $str ? $s1 : $str;
|
||
$asc = ord($s[0]) * 256 + ord($s[1]) - 65536;
|
||
if ($asc >= -20319 && $asc <= -20284) {
|
||
return 'A';
|
||
}
|
||
if ($asc >= -20283 && $asc <= -19776) {
|
||
return 'B';
|
||
}
|
||
if ($asc >= -19775 && $asc <= -19219) {
|
||
return 'C';
|
||
}
|
||
if ($asc >= -19218 && $asc <= -18711) {
|
||
return 'D';
|
||
}
|
||
if ($asc >= -18710 && $asc <= -18527) {
|
||
return 'E';
|
||
}
|
||
if ($asc >= -18526 && $asc <= -18240) {
|
||
return 'F';
|
||
}
|
||
if ($asc >= -18239 && $asc <= -17923) {
|
||
return 'G';
|
||
}
|
||
if ($asc >= -17922 && $asc <= -17418) {
|
||
return 'H';
|
||
}
|
||
if ($asc >= -17417 && $asc <= -16475) {
|
||
return 'J';
|
||
}
|
||
if ($asc >= -16474 && $asc <= -16213) {
|
||
return 'K';
|
||
}
|
||
if ($asc >= -16212 && $asc <= -15641) {
|
||
return 'L';
|
||
}
|
||
if ($asc >= -15640 && $asc <= -15166) {
|
||
return 'M';
|
||
}
|
||
if ($asc >= -15165 && $asc <= -14923) {
|
||
return 'N';
|
||
}
|
||
if ($asc >= -14922 && $asc <= -14915) {
|
||
return 'O';
|
||
}
|
||
if ($asc >= -14914 && $asc <= -14631) {
|
||
return 'P';
|
||
}
|
||
if ($asc >= -14630 && $asc <= -14150) {
|
||
return 'Q';
|
||
}
|
||
if ($asc >= -14149 && $asc <= -14091) {
|
||
return 'R';
|
||
}
|
||
if ($asc >= -14090 && $asc <= -13319) {
|
||
return 'S';
|
||
}
|
||
if ($asc >= -13318 && $asc <= -12839) {
|
||
return 'T';
|
||
}
|
||
if ($asc >= -12838 && $asc <= -12557) {
|
||
return 'W';
|
||
}
|
||
if ($asc >= -12556 && $asc <= -11848) {
|
||
return 'X';
|
||
}
|
||
if ($asc >= -11847 && $asc <= -11056) {
|
||
return 'Y';
|
||
}
|
||
if ($asc >= -11055 && $asc <= -10247) {
|
||
return 'Z';
|
||
}
|
||
return null;
|
||
}
|
||
} |