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

PHP店铺营业时间排序异常问题求助

解决店铺营业时间排序问题

你的核心需求是先按星期的自然顺序排序,同星期的条目再按开始时间从早到晚排列,之前用array_multisort出问题,是因为直接对星期文本做数字排序时,非数字开头的字符串会被转为0,所有星期文本都会被判定为同一优先级,导致顺序混乱。

解决方案:用usort实现自定义排序

我们可以先定义星期的优先级映射,再通过自定义排序逻辑实现需求:

// 定义星期的自然顺序优先级(把周日设为一周最后一位)
$dayPriority = [
    'Mon' => 1,
    'Tue' => 2,
    'Wed' => 3,
    'Tur' => 4,
    'Fri' => 5,
    'Sat' => 6,
    'Sun' => 7,
];

// 执行自定义排序
usort($array, function($a, $b) use ($dayPriority) {
    // 第一步:按起始星期的优先级排序
    $aRank = $dayPriority[$a['start']];
    $bRank = $dayPriority[$b['start']];
    
    if ($aRank !== $bRank) {
        return $aRank - $bRank;
    }
    
    // 第二步:起始星期相同时,按开始时间的数值大小排序
    $aTime = (int)$a['stime'];
    $bTime = (int)$b['stime'];
    
    return $aTime - $bTime;
});

// 遍历输出验证
foreach ($array as $item) {
    echo "{$item['start']} - {$item['end']} {$item['stime']} : {$item['etime']}\n";
}

方案说明

  1. 星期优先级映射:给每个星期文本分配对应数字,确保排序遵循Mon → Tue → Wed → Tur → Fri → Sat → Sun的自然顺序,避免字符串排序的逻辑错误。
  2. 分层排序逻辑:先按起始星期排序,同星期的条目再按开始时间从小到大排列,完全匹配你期望的输出顺序。

最终输出结果

Mon - Fri 0900 : 1700
Wed - Wed 0900 : 1200
Wed - Wed 1300 : 1700
Sat - Sat 0200 : 2100
Sun - Sun 0900 : 1300

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:13:14