利用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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(2)
Oct 09 PHP
php 购物车的例子
May 04 PHP
解析百度搜索结果link?url=参数分析 (全)
Oct 09 PHP
使用php判断网页是否gzip压缩
Jun 25 PHP
浅析memcache启动以及telnet命令详解
Jun 28 PHP
php过滤HTML标签、属性等正则表达式汇总
Sep 22 PHP
thinkphp判断访客为手机端或PC端的方法
Nov 24 PHP
php随机生成数字字母组合的方法
Mar 18 PHP
php实现的简单检验登陆类
Jun 18 PHP
php实现图片上传并进行替换操作
Mar 15 PHP
PHP实现的多文件上传类及用法示例
May 06 PHP
PHP实现数组array转换成xml的方法
Jul 19 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的栏目导航程序
2006/10/09 PHP
基于empty函数的判断详解
2013/06/17 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
PHP7常量数组用法分析
2016/09/26 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
python 查找文件名包含指定字符串的方法
2018/06/05 Python
python 调用有道api接口的方法
2019/01/03 Python
Python中请不要再用re.compile了
2019/06/30 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
html5中使用hotcss.js实现手机端自适配的方法
2020/04/23 HTML / CSS
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
ktv筹备计划书
2014/05/03 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android