You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码说明

  1. 提取首字母:使用substr($alumni['lastname'], 0, 1)获取姓氏的第一个字符,再用strtoupper()转为大写,避免因为大小写导致同一字母分成两个分组(比如"A"和"a")。
  2. 初始化分组:检查当前首字母对应的分组是否存在,不存在则先创建一个空数组,确保后续可以直接向其中添加元素。
  3. 添加元素到分组:将当前校友的信息数组追加到对应首字母的分组下。

执行这段代码后,$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:47:31