利用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 相关文章推荐
真正面向对象编程:PHP5.01发布
Oct 09 PHP
使用PHP实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
Oct 09 PHP
php获取网页上所有链接的方法
Apr 03 PHP
PHP实现事件机制的方法
Jul 10 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
Oct 22 PHP
基于PHP实现简单的随机抽奖小程序
Jan 05 PHP
PHP去除字符串最后一个字符的三种方法实例
Mar 01 PHP
PHP开发中csrf攻击的简单演示和防范
May 07 PHP
PHP简单实现防止SQL注入的方法
Mar 13 PHP
解决laravel 表单提交-POST 异常的问题
Oct 15 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 PHP
详解Go与PHP的语法对比
May 29 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/04/09 PHP
php 分库分表hash算法
2009/11/12 PHP
PHP 批量更新网页内容实现代码
2010/01/05 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
jquery live()调用不存在的解决方法
2014/02/26 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
javascript每日必学之封装
2016/02/23 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
Vue写一个简单的倒计时按钮功能
2018/04/20 Javascript
vue.js前后端数据交互之提交数据操作详解
2018/04/24 Javascript
JointJS流程图的绘制方法
2018/12/03 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
package.json各个属性说明详解
2020/03/11 Javascript
Python常见文件操作的函数示例代码
2011/11/15 Python
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
Python3中的2to3转换工具使用示例
2015/06/12 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
Python OpenCV获取视频的方法
2018/02/28 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
对python 命令的-u参数详解
2018/12/03 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
Python找出列表中出现次数最多的元素三种方式
2020/02/24 Python
物流业务员岗位职责
2014/02/08 职场文书
党员公开承诺书内容
2014/05/20 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书
Django如何与Ajax交互
2021/04/29 Python
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL