服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - PHP教程 - 利用PHP获取汉字首字母并且分组排序详解

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

2021-07-10 16:23PHP教程网 PHP教程

这篇文章主要给大家介绍了关于如何利用PHP获取汉字首字母并且分组排序的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用php具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

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

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

正题

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<?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;
 }
 
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 按首字母排序
$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还是网页,都可以用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
$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'
  )
 )
);

总结

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

原文链接:http://yii.tech1024.cn/original/2952.html

延伸 · 阅读

精彩推荐
  • PHP教程php FLEA中二叉树数组的遍历输出

    php FLEA中二叉树数组的遍历输出

    最近在做一个项目其中涉及到“无限级回复”,FLEA中中有一个关于数组的辅助类:FLEA_Helper_Array,这个类里面有一个非常强大的数组处理方法:array_to_tre...

    PHP教程网3772020-01-12
  • PHP教程PHP等比例压缩图片的实例代码

    PHP等比例压缩图片的实例代码

    本文通过一段简单的代码给大家介绍PHP等比例压缩图片的方法,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧 ...

    kaykay0124782019-09-18
  • PHP教程PHP命令行脚本接收传入参数的三种方式

    PHP命令行脚本接收传入参数的三种方式

    这篇文章主要介绍了PHP命令行脚本接收传入参数的三种方式,即把PHP脚本像Python脚本、Ruby脚本、Shell脚本一样,用来处理命令行程序,如何获取命令行中的参数...

    琼台4022020-07-23
  • PHP教程php gzip压缩输出的实现方法

    php gzip压缩输出的实现方法

    本篇文章介绍了,在php中gzip压缩输出的实现方法。需要的朋友参考下 ...

    PHP教程网4412020-03-21
  • PHP教程php实现refresh刷新页面批量导入数据的方法

    php实现refresh刷新页面批量导入数据的方法

    这篇文章主要介绍了php实现refresh刷新页面批量导入数据的方法,借鉴了dedecms批量生成html的原理,采用refresh代替js跳转来实现,非常具有实用价值,需要的朋友可...

    PHP之家3712020-08-24
  • PHP教程PHP中的替代语法介绍

    PHP中的替代语法介绍

    这篇文章主要介绍了PHP中的替代语法介绍,PHP替代语法经常会用在模板代码的编写中,比如wordpress的模板中就大量使用这种语法,需要的朋友可以参考下...

    PHP教程网4802020-08-28
  • PHP教程PHP如何使用Memcached

    PHP如何使用Memcached

    memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性...

    闻海南7412021-01-08
  • PHP教程深入理解PHP之require/include顺序 推荐

    深入理解PHP之require/include顺序 推荐

    在大型的Web项目中, include_path是一个模块化设计的根本中的根本(当然,现在也有很多基于autoload的设计, 这个不影响本文的探讨), 但是正是因为include_path, 经常...

    php教程网4612019-11-14