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

时间:2022-03-07 00:36:36

前言

本文主要给大家介绍了关于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