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