微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

利用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;
  }
 
}

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

?
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‘
   )
  )
);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐