利用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
透析PHP的配置文件php.ini
Oct 09 PHP
mysql总结之explain
Feb 27 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
php的慢速日志引起的Mysql错误问题分析
May 13 PHP
PHP独立Session数据库存储操作类分享
Jun 11 PHP
php计算函数执行时间的方法
Mar 20 PHP
PHP curl使用实例
Jul 02 PHP
Joomla开启SEF的方法
May 04 PHP
PHP异常类及异常处理操作实例详解
Dec 19 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 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大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
javascript基础知识大集锦(一) 推荐收藏
2011/01/13 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
AngularJs验证重复密码的方法(两种)
2016/11/25 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
详解JavaScript中的坐标和距离
2019/05/27 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
Python实现提取文章摘要的方法
2015/04/21 Python
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
基于python实现名片管理系统
2018/11/30 Python
Python+OpenCv制作证件图片生成器的操作方法
2019/08/21 Python
python元组的概念知识点
2019/11/19 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
教师个人自我鉴定
2014/02/08 职场文书
2014年实习期工作总结
2014/11/27 职场文书
党员自我评价范文2015
2015/03/03 职场文书
道歉信怎么写
2015/05/12 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库