加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 17:53:39 所属栏目:PHP教程 来源:网络整理
导读:?php ? /** ? * @author Tech ? */ class Character { ? /** ?? * 二维数组根据首字母分组排序 ?? * @param array $data? 二维数组 ?? * @param string $targetKey 首字母的键名 ?? * @return array??? 根据首字母关联的二维数组 ?? */ ? public function gr
<?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‘
?? )
? )
);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读