利用PHP获取汉字首字母并且分组排序详解


Posted in PHP onOctober 22, 2017

前言

本文主要给大家介绍了关于PHP获取汉字首字母并分组排序的相关内容,因经常我们在做项目的时候,会有按首字母排序的需求 比如: 美团的城市选择 http://www.meituan.com/index/changecity/initiative app中按字母搜索

利用PHP获取汉字首字母并且分组排序详解

正题

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

<?php

/**
 * @author Tech
 */
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;
 }

}

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

// 按首字母排序
$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'
  )
 )
);

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
用PHP实现文件上传二法
Oct 09 PHP
PHP5 面向对象(学习记录)
Dec 02 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
ThinkPHP中U方法的使用浅析
Jun 13 PHP
ThinkPHP整合百度Ueditor图文教程
Oct 21 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
php实现多城市切换特效
Aug 09 PHP
再谈PHP中单双引号的区别详解
Jun 12 PHP
简单谈谈PHP中的Reload操作
Dec 12 PHP
php实现的二分查找算法示例
Jun 20 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 #PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 #PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 #PHP
php+ajax实现仿百度查询下拉内容功能示例
Oct 20 #PHP
详解cookie验证的php应用的一种SSO解决办法
Oct 20 #PHP
thinkPHP5项目中实现QQ第三方登录功能
Oct 20 #PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 #PHP
You might like
功能齐全的PHP发送邮件类代码附详细说明
2008/07/10 PHP
php xml文件操作代码(一)
2009/03/20 PHP
如何在HTML 中嵌入 PHP 代码
2015/05/13 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
js取得html iframe中的元素和变量值
2014/06/30 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
JS中的进制转换以及作用
2016/06/26 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
jQuery中 bind的用法简单介绍
2017/02/13 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
phantomjs导出html到pdf的方法总结
2017/10/19 Javascript
AngularJS集合数据遍历显示的实例
2017/12/27 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
vue常用指令代码实例总结
2020/03/16 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
新闻记者实习自我鉴定
2013/09/19 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
防汛工作情况汇报
2014/10/28 职场文书
家长反馈意见及建议
2015/06/03 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python