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. C#上机实验(三)

    源码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespac ...

  2. vue 给一个值重置初始值

    查了下资料很多都是如下: 1. this.$options.data() 这个可以获取原始的data值,this.$data 获取当前状态下的data,拷贝重新赋值一下就行了. 1 Object.as ...

  3. wrf模拟的domain图绘制

    wrf模拟的区域绘制,domain图,利用python的cartopy库绘制模拟区域 参考Liang Chen的draw_wrf_domian.py这个代码, 出处python画wrf模式的模拟区域 ...

  4. 什么是SSR SSR有什么用 如何使用使用SSR

    什么是SSR 以下信息来自维基百科: Shadowsocks(简称SS)是一种基于Socks5代理方式的加密传输协议,也可以指实现这个协议的各种开发包.当前包使用Python.C.C++.C#.Go语 ...

  5. 13 条高效实用的 JavaScript 单行代码

    JavaScript可以实现很多令人惊奇的事! 从复杂的框架到处理API,有太多的东西可以学习. 甚至,仅用一行代码,它也能完成一些很棒的工作. 不信?那么请看这13条JavaScript单行代码,用 ...

  6. Powerful Number 筛学习笔记

    Powerful Number 筛学习笔记 用途 \(Powerful\ number\) 筛可以用来求出一类积性函数的前缀和,最快可以达到根号复杂度. 实现 \(Powerful\ number\) ...

  7. Android学习之Layoutinflater的用法

    •她的第一次 话说,那是一个风雪交加的夜晚,看着她独自一个人走在漆黑的小道上,我抓紧跟了过去: 那晚,我们...... 记得第一次接触这个 Layoutinflater 应该是在学习 ListView ...

  8. NameError: name 'foo' is not defined Python常见错误

    1.变量或者函数名拼写错误 2.在一个定义新变量中使用增值操作符 没有定义的变量被引用时候会出现此错误

  9. java面试-谈谈你对volatile的理解

    一.volatile特性: volatile是Java虚拟机提供的轻量级的同步机制.主要有三大特性: 保证可见性 不保证原子性 禁止指令重排序 1.保证可见性 1)代码演示 AAA线程修改变量numb ...

  10. Spring MVC(七篇)

    (一)Spring MVC简介 (二)SpringMVC核心控制器 (三)Spring MVC Controller接口控制器详解(一) (三)Spring MVC Controller接口控制器详解 ...