1.代码
class Character
{

/**
* 数组根据首首字母排序
*/

/**
* 二维数组根据首字母分组排序
* @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', '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;
}

}
2.用法举例

$data = [
['id' => 1, 'area_name' => '山东'],
['id' => 1, 'area_name' => '江苏'],
['id' => 1, 'area_name' => '安徽'],
['id' => 1, 'area_name' => '福建'],
['id' => 1, 'area_name' => '江西'],
['id' => 1, 'area_name' => '广东'],
['id' => 1, 'area_name' => '广西'],
['id' => 1, 'area_name' => '海南'],
['id' => 1, 'area_name' => '河南'],
['id' => 1, 'area_name' => '湖南'],
['id' => 1, 'area_name' => '湖北'],
];
$data = (new Character)->groupByInitials($data, 'area_name');

原文链接:https://blog.csdn.net/hxl1995/article/details/78280219(感谢博主分享)

获取汉字首字母并分组排列 PHP的更多相关文章

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

    <?php /** * 错误状态码定义 * User: xiucai * Date: 2018/3/11 * Time: 12:23 */ namespace extend; class Wor ...

  2. JS获取汉字首字母

    //获取 汉字首字母 function makePy(str) { if (typeof (str) != "string") throw new Error(-1, " ...

  3. ASP.NET获取汉字首字母

    /// <summary> /// 获取汉字首字母(可包含多个汉字) /// </summary> /// <param name="strText" ...

  4. php获取汉字首字母

    php获取汉字首字母,可以用于按字母对数据进行检索排序等. 分享下网上找的代码.亲测有效. function getFirstCharter($str){ if(empty($str)){return ...

  5. JS实现获取汉字首字母拼音、全拼音及混拼音的方法

    本文实例讲述了JS实现获取汉字首字母拼音.全拼音及混拼音的方法.分享给大家供大家参考,具体如下: 这里需要用到一个js获取汉字拼音的插件,可点击此处本站下载. 运行效果如下: 完整示例代码: ? 1 ...

  6. .NET获取汉字首字母

    /// <summary> /// 获取汉字首字母(可包含多个汉字) /// </summary> /// <param name="strText" ...

  7. python获取汉字首字母

    获取汉字首字母 关注公众号"轻松学编程"了解更多. 应用场景之一:可用于获取名字首字母,在数据库中查询记录时,可以用它来排序输出. from pytz import unicode ...

  8. php获取汉字首字母的函数

    本文介绍用php实现汉字转化为首字母的方法,主要功能是:功能明确,易于修改维护和扩展: 英文的字串:不变返回(包括数字):中文字符串:返回拼音首字符: 中英混合串: 返回拼音首字符和英文. 网上的方法 ...

  9. php获取汉字首字母实例

    在我们实际开发工作中,有时候需要获取输入汉字的首字母,然后存到库中,方便用户搜索相关信息,下面给出php代码,留做备用: //新添加获取汉子首字,首字字母 function pinyin($zh){ ...

随机推荐

  1. Java BasicNameValuePair怎么传数组类型的参数?

    BasicNameValuePair 传数组的话可以这样传 map.put("ids[]", 1); map.put("ids[]", 2);

  2. dk.exe自动填报程序的反编译

    dk.exe自动填报程序的反编译 dk.exe用于学校每日健康报的自动填写.

  3. 【JVM进阶之路】七:垃圾收集器盘点

    在前面,我们已经了解了JVM的分代收集,知道JVM垃圾收集在新生代主要采用标记-复制算法,在老年代主要采用标记-清除和标记-整理算法.接下来,我们看一看JDK默认虚拟机HotSpot的一些垃圾收集器的 ...

  4. vue实现拖拽排序

    基于vue实现列表拖拽排序的效果 在日常开发中,特别是管理端,经常会遇到要实现拖拽排序的效果:这里提供一种简单的实现方案. 此例子基于vuecli3 首先,我们先了解一下js原生拖动事件: 在拖动目标 ...

  5. SQL 存储过程里调用另一个存储过程

    由于创建了一个存储过程,并且要在另一个存储过程里调用这个存储过程所以在网上找了一下相关的代码,现在总结一下,防止以后还会用到 由于这次我写的存储过程只需要返回一个求和的结果,所以我使用了output ...

  6. Java基础回顾_第一部分

    Java基础回顾 基本数据类型 数值类型 什么是字节? 位(bit):是计算机中数据的最小单位 字节(byte):是计算机中数据处理的基本单位,习惯上用大写字母B来表示 1 B = 8 bit 字符: ...

  7. SQL语句练习(基础版)

    最近在学习SQL基本语句的练习,在此分享一下笔者做过的练习以及个人的解决教程: 首先是基本练习表格的搭建,具体内容如下表所示: Snum Sname Ssex Sage Sphone Dname S0 ...

  8. 201871030102_崔红梅 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程2. 掌握Github协作开发程序的操作方法.3.阅读<现代软 ...

  9. 软工热身——回顾&展望

    项目 内容 这个作业属于哪个课程 2021春季软件工程 (罗杰 任健) 这个作业的要求在哪里 第一次阅读作业 我在这个课程的目标是 从实践中学习软件工程相关知识(结构化分析和设计方法.敏捷开发方法.软 ...

  10. SQL Server如何将查询的内容保存到新的sql 表中

    我是采用语句将 查询后的数据保存到一个新表中 1)采用into table 语句,需要保存到的这个新表不需要提前创建 select *into NewTable from Table --插入新表的语 ...