资讯专栏INFORMATION COLUMN

PHP获取汉字首字母并分组排序

pkhope / 3124人阅读

摘要:二维数组根据首字母分组排序二维数组首字母的键名根据首字母关联的二维数组按字母排序获取首字母汉字字符串首字母项目中直接引入即可,如果需要命名空间,可以自行添加,下面是我们看看怎么用。

写在前面

经常我们在做项目的时候,会有按首字母排序的需求
比如:
美团的城市选择 http://www.meituan.com/index/...
app中按字母搜索

正题

网上找了各种,不尽人意,于是,自己就写了一个,分享给大家。

 $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", "gb2312", $str);
        $s2  = iconv("gb2312", "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;
    }

}

项目中直接引入即可,如果需要命名空间,可以自行添加,下面是我们看看怎么用。

// 按首字母排序
$data = [
    ["id" => 1, "area_name" => "山东"],
    ["id" => 2, "area_name" => "江苏"],
    ["id" => 3, "area_name" => "安徽"],
    ["id" => 4, "area_name" => "福建"],
    ["id" => 5, "area_name" => "江西"],
    ["id" => 6, "area_name" => "广东"],
    ["id" => 7, "area_name" => "广西"],
    ["id" => 8, "area_name" => "海南"],
    ["id" => 9, "area_name" => "河南"],
    ["id" => 10, "area_name" => "湖南"],
    ["id" => 11, "area_name" => "湖北"],
];
// 初始化,然后调用分组方法
$data = (new Character)->groupByInitials($data, "area_name");

下面的结果是不是你想要的呢,不论是做app还是网页,都可以用

$data = array(
    "A" => array(
        0 => array(
            "id" => 3,
            "area_name" => "安徽",
            "initials" => "A"
        )
    ) ,
    "F" => array(
        0 => array(
            "id" => 4,
            "area_name" => "福建",
            "initials" => "F"
        )
    ) ,
    "G" => array(
        0 => array(
            "id" => 6,
            "area_name" => "广东",
            "initials" => "G"
        ) ,
        1 => array(
            "id" => 7,
            "area_name" => "广西",
            "initials" => "G"
        )
    ) ,
    "H" => array(
        0 => array(
            "id" => 8,
            "area_name" => "海南",
            "initials" => "H"
        ) ,
        1 => array(
            "id" => 9,
            "area_name" => "河南",
            "initials" => "H"
        ) ,
        2 => array(
            "id" => 10,
            "area_name" => "湖南",
            "initials" => "H"
        ) ,
        3 => array(
            "id" => 11,
            "area_name" => "湖北",
            "initials" => "H"
        )
    ) ,
    "J" => array(
        0 => array(
            "id" => 2,
            "area_name" => "江苏",
            "initials" => "J"
        ) ,
        1 => array(
            "id" => 5,
            "area_name" => "江西",
            "initials" => "J"
        )
    ) ,
    "S" => array(
        0 => array(
            "id" => 1,
            "area_name" => "山东",
            "initials" => "S"
        )
    )
);

原文 http://www.tech1024.cn/origin...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30659.html

相关文章

  • 实战PHP导出Excel-CSV文件

    摘要:中国大陆几乎所有的中文系统和国际化的软件都支持。与相应的国家标准中的其它汉字,以上合计个汉字。,全称国家标准信息技术中文编码字符集,是中华人民共和国现时最新的内码字集,是信息技术信息交换用汉字编码字符集基本集的扩充的修订版。 实战PHP导出Excel-CSV文件 导出后的效果 先给各位看一下导出的效果,而后再进行代码分析 showImg(https://segmentfault.co...

    Kyxy 评论0 收藏0
  • 实战PHP导出Excel-CSV文件

    摘要:中国大陆几乎所有的中文系统和国际化的软件都支持。与相应的国家标准中的其它汉字,以上合计个汉字。,全称国家标准信息技术中文编码字符集,是中华人民共和国现时最新的内码字集,是信息技术信息交换用汉字编码字符集基本集的扩充的修订版。 实战PHP导出Excel-CSV文件 导出后的效果 先给各位看一下导出的效果,而后再进行代码分析 showImg(https://segmentfault.co...

    molyzzx 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<