PHP技术求助:如何将已按姓氏排序的数组按姓氏首字母分组
如何按姓氏首字母对PHP数组进行分组?
你已经成功完成了校友列表按姓氏排序的操作,接下来只需要在排序后添加一段逻辑,把排好序的数组按姓氏首字母归类到对应的分组中即可。
修改后的完整代码
$alumnis_array_lastname = array(); foreach( $alumnis_list_lastname as $key => $post ) { $word = explode( ' ', $post->post_title, 2 ); $lastname = ''; if (strlen($word[1]) == 1) { $lastname = $word[0]; } else { $lastname = $word[1]; } $firstname = $word[0]; $alumnis_array_lastname[] = array('firstname'=>$firstname, 'lastname'=>$lastname); } // 按姓氏排序 uasort($alumnis_array_lastname, function($a, $b) { return strcasecmp($a['lastname'], $b['lastname']); }); // 新增:按姓氏首字母分组 $grouped_alumnis = []; foreach ($alumnis_array_lastname as $alumni) { // 提取姓氏首字母并转为大写,确保分组键统一格式 $initial = strtoupper(substr($alumni['lastname'], 0, 1)); // 如果该字母分组不存在,先初始化空数组 if (!isset($grouped_alumnis[$initial])) { $grouped_alumnis[$initial] = []; } // 将当前校友信息加入对应分组 $grouped_alumnis[$initial][] = $alumni; }
代码说明
- 提取首字母:使用
substr($alumni['lastname'], 0, 1)获取姓氏的第一个字符,再用strtoupper()转为大写,避免因为大小写导致同一字母分成两个分组(比如"A"和"a")。 - 初始化分组:检查当前首字母对应的分组是否存在,不存在则先创建一个空数组,确保后续可以直接向其中添加元素。
- 添加元素到分组:将当前校友的信息数组追加到对应首字母的分组下。
执行这段代码后,$grouped_alumnis就是你需要的按姓氏首字母分组的数组结构,和你期望的输出完全一致。
可选优化:边构建边分组
如果你想减少一次遍历,也可以在最初构建数组的时候直接完成分组,之后再对每个分组内部排序(不过这种方式和你先整体排序再分组的逻辑略有不同,但最终效果一致):
$grouped_alumnis = []; foreach( $alumnis_list_lastname as $key => $post ) { $word = explode( ' ', $post->post_title, 2 ); $lastname = ''; if (strlen($word[1]) == 1) { $lastname = $word[0]; } else { $lastname = $word[1]; } $firstname = $word[0]; $alumni = array('firstname'=>$firstname, 'lastname'=>$lastname); $initial = strtoupper(substr($lastname, 0, 1)); if (!isset($grouped_alumnis[$initial])) { $grouped_alumnis[$initial] = []; } $grouped_alumnis[$initial][] = $alumni; } // 对每个分组内部按姓氏排序 foreach ($grouped_alumnis as &$group) { usort($group, function($a, $b) { return strcasecmp($a['lastname'], $b['lastname']); }); } unset($group); // 解除引用
内容的提问来源于stack exchange,提问作者Jandon
相关产品推荐
相关产品推荐

