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

PHP按包含可选键的多字段对数组排序的实现方案

解决方案

方案1:使用usort自定义排序逻辑(推荐)

array_multisort要求传入的排序维度数组长度必须和原数组完全一致,直接用array_column读取可选键会过滤掉不存在该键的元素,所以触发长度不一致警告。改用usort在回调中动态判断字段是否存在,不需要修改原数组:

usort($data, function($a, $b) {
    // 优先按bookID升序
    $bookCmp = (int)$a['bookID'] <=> (int)$b['bookID'];
    if ($bookCmp !== 0) {
        return $bookCmp;
    }
    // bookID相同按chapter升序
    $chapterCmp = (int)$a['chapter'] <=> (int)$b['chapter'];
    if ($chapterCmp !== 0) {
        return $chapterCmp;
    }
    // 最后处理versesFirst,不存在的默认赋值为0(排最前面)
    $aVerse = isset($a['versesFirst']) ? (int)$a['versesFirst'] : 0;
    $bVerse = isset($b['versesFirst']) ? (int)$b['versesFirst'] : 0;
    return $aVerse <=> $bVerse;
});

运行后排序结果符合要求,bookID=75的两个元素会按versesFirst升序排列,versesFirst=1的项排在前面。


方案2:仍使用array_multisort,生成临时排序维度数组

如果不想换array_multisort,可以通过array_map生成补齐默认值的临时维度数组,不会修改原数组:

// 生成versesFirst维度的临时数组,不存在的补0
$versesFirst = array_map(function($item) {
    return isset($item['versesFirst']) ? (int)$item['versesFirst'] : 0;
}, $data);

array_multisort(
    array_column($data, 'bookID'), SORT_ASC,
    array_column($data, 'chapter'), SORT_ASC,
    $versesFirst, SORT_ASC,
    $data
);

内容的提问来源于stack exchange,提问作者knot22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:54:04