123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <?php
- /**
- * Created by PhpStorm.
- * User: Administrator
- * Date: 21/11/23
- * Time: 19:05.
- */
- namespace App\Services\Api;
- class SortService
- {
- // $list 二维数组
- public static function getResultList($list)
- {
- return self::groupByFirstLetter($list);
- }
- protected static function groupByFirstLetter($list)
- {
- $r_list = [];
- foreach ($list as $key => $val) {
- $letter = self::firstChar($val['name']);
- $val['letter'] = $letter;
- $r_list[$letter][] = $val;
- }
- foreach ($r_list as $k => $v) {
- $r_list[$k] = self::listSortBy($v, 'name');
- }
- ksort($r_list);
- $r_list = array_values($r_list);
- return $r_list;
- }
- protected static function listSortBy($list, $field)
- {
- $arr = $result = [];
- foreach ($list as $key => $val) {
- $arr[$key] = &$val[$field];
- }
- asort($arr);
- foreach ($arr as $k => $v) {
- $result[] = &$list[$k];
- }
- return $result;
- }
- public static function firstChar($s)
- {
- $s0 = mb_substr($s, 0, 3); // 获取名字的姓
- $s = iconv('UTF-8', 'gb2312', $s0); // 将UTF-8转换成GB2312编码
- if (ord($s0) > 128) { // 汉字开头,汉字没有以U、V开头的
- $asc = ord($s[0]) * 256 + ord($s[0]) - 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';
- }
- } elseif (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';
- }
- } elseif (ord($s) >= 65 and ord($s) <= 90) { // 大写英文开头
- return substr($s, 0, 1);
- } elseif (ord($s) >= 97 and ord($s) <= 122) { // 小写英文开头
- return strtoupper(substr($s, 0, 1));
- } else {
- return iconv_substr($s0, 0, 1, 'utf-8');
- }
- }
- }
|