服务器之家

服务器之家 > 正文

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

时间:2021-07-10 16:23     来源/作者: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

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部