方法一:
直接排序不返回首字母
$old_list = $this->model->field('id, number, username, mobile')
->where('xxx', 'xxx')
->select();
foreach ($old_list as $key => $value) {
$value['username'] = iconv('UTF-8', 'GBK', $value['username']);
$new_list[$key] = $value;
}
array_multisort(array_column($new_list, 'username'), SORT_ASC, $new_list);
foreach ($new_list as $key => $value) {
$value['username'] = iconv('GBK', 'UTF-8', $value['username']);
$list [$key] = $value;
}
方法二:
返回首字母的排序
public function test() {
$list = $this->model->field('id, number, username, mobile')
->where('xxx', 'xxx')
->select();
foreach ($list as $name) {
$char = $this->getFirstChar($name['username']);
$nameArray = array();
if (isset($charArray[$char]) && count($charArray[$char]) != 0) {
$nameArray = $charArray[$char];
}
array_push($nameArray, $name);
$charArray[$char] = $nameArray;
}
ksort($charArray);
echo '<pre>';
var_dump($charArray);
}
public function getFirstChar($s)
{
$s0 = mb_substr($s, 0, 3); //获取名字的姓
$s = iconv('UTF-8', 'gb2312', $s0); // 将UTF-8转换成GB2312编码
if (ord($s0) > 128) { //汉字开头,汉字没有以U、V开头的
$asc = ord($s[0]) * 256 + ord($s[1]) - 65536;
#################################################
### 如果没有对应首字母 打印 $asc 的值 ###
### 在 FamilyNamesRareWords 方法中 ###
### $rare_arr 数组中手动添加对应首字母即可 ###
#################################################
if ($asc >= -20319 and $asc <= -20284) return "A";
if ($asc >= -20283 and $asc <= -19776) return "B";
if ($asc >= -19775 and $asc <= -19219) return "C";
if ($asc >= -19218 and $asc <= -18711) return "D";
if ($asc >= -18710 and $asc <= -18527) return "E";
if ($asc >= -18526 and $asc <= -18240) return "F";
if ($asc >= -18239 and $asc <= -17760) return "G";
if ($asc >= -17759 and $asc <= -17248) return "H";
if ($asc >= -17247 and $asc <= -17418) return "I";
if ($asc >= -17417 and $asc <= -16475) return "J";
if ($asc >= -16474 and $asc <= -16213) return "K";
if ($asc >= -16212 and $asc <= -15641) return "L";
if ($asc >= -15640 and $asc <= -15166) return "M";
if ($asc >= -15165 and $asc <= -14923) return "N";
if ($asc >= -14922 and $asc <= -14915) return "O";
if ($asc >= -14914 and $asc <= -14631) return "P";
if ($asc >= -14630 and $asc <= -14150) return "Q";
if ($asc >= -14149 and $asc <= -14091) return "R";
if ($asc >= -14090 and $asc <= -13319) return "S";
if ($asc >= -13318 and $asc <= -12839) return "T";
if ($asc >= -12838 and $asc <= -12557) return "W";
if ($asc >= -12556 and $asc <= -11848) return "X";
if ($asc >= -11847 and $asc <= -11056) return "Y";
if ($asc >= -11055 and $asc <= -10247) return "Z";
return $this->FamilyNamesRareWords($asc);
} else if (ord($s) >= 48 and ord($s) <= 57) { // 数字开头
switch (iconv_substr($s, 0, 1, 'utf-8')) {
case 1:
return "Y";
case 2:
return "E";
case 3:
return "S";
case 4:
return "S";
case 5:
return "W";
case 6:
return "L";
case 7:
return "Q";
case 8:
return "B";
case 9:
return "J";
case 0:
return "L";
}
} else if (ord($s) >= 65 and ord($s) <= 90) { //大写英文开头
return substr($s, 0, 1);
} else if (ord($s) >= 97 and ord($s) <= 122) { //小写英文开头
return strtoupper(substr($s, 0, 1));
} else {
return iconv_substr($s0, 0, 1, 'utf-8');
// 中英混合的词语,不适合上面的各种情况,因此直接提取首个字符即可
}
}
/**
* 百家姓中的生僻字
*/
public function FamilyNamesRareWords($asc = '')
{
$rare_arr = array(
-3630 => array('word' => "褚", 'first_char' => 'C'),
-3652 => array('word' => "窦", 'first_char' => 'D'),
-8503 => array('word' => "奚", 'first_char' => 'X'),
-9286 => array('word' => "酆", 'first_char' => 'F'),
-7761 => array('word' => "岑", 'first_char' => 'C'),
-5128 => array('word' => "滕", 'first_char' => 'T'),
-9479 => array('word' => "邬", 'first_char' => 'W'),
-5456 => array('word' => "臧", 'first_char' => 'Z'),
-7223 => array('word' => "闵", 'first_char' => 'M'),
-2877 => array('word' => "裘", 'first_char' => 'Q'),
-6191 => array('word' => "缪", 'first_char' => 'M'),
-5414 => array('word' => "贲", 'first_char' => 'B'),
-4102 => array('word' => "嵇", 'first_char' => 'J'),
-8969 => array('word' => "荀", 'first_char' => 'X'),
-4938 => array('word' => "於", 'first_char' => 'Y'),
-9017 => array('word' => "芮", 'first_char' => 'R'),
-2848 => array('word' => "羿", 'first_char' => 'Y'),
-9477 => array('word' => "邴", 'first_char' => 'B'),
-9485 => array('word' => "隗", 'first_char' => 'K'),
-6731 => array('word' => "宓", 'first_char' => 'M'),
-9299 => array('word' => "郗", 'first_char' => 'X'),
-5905 => array('word' => "栾", 'first_char' => 'L'),
-4393 => array('word' => "钭", 'first_char' => 'T'),
-9300 => array('word' => "郜", 'first_char' => 'G'),
-8706 => array('word' => "蔺", 'first_char' => 'L'),
-3613 => array('word' => "胥", 'first_char' => 'X'),
-8777 => array('word' => "莘", 'first_char' => 'S'),
-6708 => array('word' => "逄", 'first_char' => 'P'),
-9302 => array('word' => "郦", 'first_char' => 'L'),
-5965 => array('word' => "璩", 'first_char' => 'Q'),
-6745 => array('word' => "濮", 'first_char' => 'P'),
-4888 => array('word' => "扈", 'first_char' => 'H'),
-9309 => array('word' => "郏", 'first_char' => 'J'),
-5428 => array('word' => "晏", 'first_char' => 'Y'),
-2849 => array('word' => "暨", 'first_char' => 'J'),
-7206 => array('word' => "阙", 'first_char' => 'Q'),
-4945 => array('word' => "殳", 'first_char' => 'S'),
-9753 => array('word' => "夔", 'first_char' => 'K'),
-10041 => array('word' => "厍", 'first_char' => 'S'),
-5429 => array('word' => "晁", 'first_char' => 'C'),
-2396 => array('word' => "訾", 'first_char' => 'Z'),
-7205 => array('word' => "阚", 'first_char' => 'K'),
-10049 => array('word' => "乜", 'first_char' => 'N'),
-10015 => array('word' => "蒯", 'first_char' => 'K'),
-3133 => array('word' => "竺", 'first_char' => 'Z'),
-6698 => array('word' => "逯", 'first_char' => 'L'),
-9799 => array('word' => "俟", 'first_char' => 'Q'),
-6749 => array('word' => "澹", 'first_char' => 'T'),
-7220 => array('word' => "闾", 'first_char' => 'L'),
-10047 => array('word' => "亓", 'first_char' => 'Q'),
-10005 => array('word' => "仉", 'first_char' => 'Z'),
-3417 => array('word' => "颛", 'first_char' => 'Z'),
-6431 => array('word' => "驷", 'first_char' => 'S'),
-7226 => array('word' => "闫", 'first_char' => 'Y'),
-9293 => array('word' => "鄢", 'first_char' => 'Y'),
-6205 => array('word' => "缑", 'first_char' => 'G'),
-9764 => array('word' => "佘", 'first_char' => 'S'),
-9818 => array('word' => "佴", 'first_char' => 'N'),
-9509 => array('word' => "谯", 'first_char' => 'Q'),
-3122 => array('word' => "笪", 'first_char' => 'D'),
-9823 => array('word' => "佟", 'first_char' => 'T'),
);
if (array_key_exists($asc, $rare_arr) && $rare_arr[$asc]['first_char']) {
return $rare_arr[$asc]['first_char'];
} else {
return null;
}
}