thinkphp 根据拼音首字母全国城市排序
/**
- 二维数组根据首字母分组排序
- @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;
}
/**
- Alphabetically sorted
- @param array$data
- @return array
*/
public function sortInitials(arraydata) { sortData = [];
for (each (data as key => value)) { if (!isset(sortData[value['initials']])) { sortData[value['initials']] = []; } [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});
}
uf8to_gbk = iconv(str, 'GBK', 'UTF-8');
gbkto_utf8 = iconv(uf8to_gbk, 'UTF-8', 'GBK');
s = (gbkto_utf8 == str) ? uf8to_gbk : str;
asc_val = ord(s[0]) << 8 | ord(s[1]) - 0x10000;
if (-0x7FFF <= asc_val && asc_val <= -0x7FE4) {
return \u{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;
}
public function initialscity(){
// 按首字母排序
$cityName = Db::query("select id,title,domain,pinyin from agent where status=1 order by convert(title using gb2312) asc");
data = this->groupByInitials(cityName, 'pinyin');
dump(data);
}

