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"; }
方案说明
- 星期优先级映射:给每个星期文本分配对应数字,确保排序遵循
Mon → Tue → Wed → Tur → Fri → Sat → Sun的自然顺序,避免字符串排序的逻辑错误。 - 分层排序逻辑:先按起始星期排序,同星期的条目再按开始时间从小到大排列,完全匹配你期望的输出顺序。
最终输出结果
Mon - Fri 0900 : 1700 Wed - Wed 0900 : 1200 Wed - Wed 1300 : 1700 Sat - Sat 0200 : 2100 Sun - Sun 0900 : 1300
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

