<?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";
        } 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');
        }
    }

}