利用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 相关文章推荐
.htaccess文件保护实例讲解
Feb 06 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
May 10 PHP
php 的反射详解及示例代码
Aug 25 PHP
php微信公众平台开发之微信群发信息
Sep 13 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 PHP
PHP实现的杨辉三角求解算法分析
Mar 11 PHP
php layui实现前端多图上传实例
Jul 30 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
Jun 06 PHP
PHP常用header头定义代码示例汇总
Aug 29 PHP
PHP哈希表实现算法原理解析
Dec 11 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
coreseek 搜索英文的问题详解
2013/06/08 PHP
yii操作session实例简介
2014/07/31 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
CI框架表单验证实例详解
2016/11/21 PHP
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
分享一些常用的jQuery动画事件和动画函数
2015/11/27 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
深入解析Vue 组件命名那些事
2017/07/18 Javascript
javascript闭包的使用之按钮切换功能
2018/08/30 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
python中os操作文件及文件路径实例汇总
2015/01/15 Python
Python执行时间的计算方法小结
2017/03/17 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
对pandas的行列名更改与数据选择详解
2018/11/12 Python
Python之列表实现栈的工作功能
2019/01/28 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
对python中return与yield的区别详解
2020/03/12 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
文员自我评价怎么写
2013/09/19 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
学生检讨书如何写
2014/10/30 职场文书
2014年售票员工作总结
2014/11/19 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
入党积极分子培养人意见
2015/06/02 职场文书
环保建议书作文400字
2015/09/14 职场文书