如何同时显示数组键与值?PHP生成营业时间列表遇阻
解决PHP动态营业时间列表的显示与高亮问题
我来帮你搞定这个问题!你的代码现在无输出,主要是因为遍历关联数组的方式错误,另外也没正确实现当前日期的高亮逻辑。下面一步步给你修正:
核心问题分析
- 关联数组遍历错误:你的
$openingHours是字符串键名的关联数组(比如sunday、monday),但用了for循环按数字索引$x去访问,这在关联数组里是无效的,直接导致没有输出。 - 当前日期获取错误:你写的
date('w', strtotime('Sunday'))永远返回0(星期日),应该直接用date('w')获取今天的星期数字(0=周日,1=周一…6=周六)。 - 未正确显示键名:原代码没拿到数组的键名(比如
wednesday),自然无法显示星期名称。
修正后的完整代码
<ul> <?php // 获取今天的星期数字(0=周日,1=周一,…6=周六) $today = date('w'); // 定义营业时间(键名对应星期数字的映射:0=>sunday,1=>monday...) $openingHours = [ "sunday" => ["Closed"], "monday" => ["Closed"], "tuesday" => ["8.30 am - 3.00 pm"], "wednesday" => ["8.30 am - 1.30 pm", "2.00 pm - 7.00 pm"], "thursday" => ["8.30 am - 0.30 pm", "2.00 pm - 7.00 pm"], "friday" => ["8.30 am - 0.30 pm", "1.00 pm - 6.00 pm"], "saturday" => ["8.30 am - 2.00 pm"] ]; // 创建星期名称和数字的映射,方便匹配高亮 $weekDaysMap = [ 0 => "sunday", 1 => "monday", 2 => "tuesday", 3 => "wednesday", 4 => "thursday", 5 => "friday", 6 => "saturday" ]; // 遍历营业时间数组,同时拿到键名(星期)和对应时间 foreach ($openingHours as $dayName => $times) { // 判断当前遍历的星期是否是今天,是的话添加高亮类 $highlightClass = (array_search($dayName, $weekDaysMap) == $today) ? 'highlight-current-day' : ''; // 把键名转换成首字母大写的友好显示名称(比如sunday→Sunday) $displayDayName = ucfirst($dayName); // 输出主列表项(显示星期名称和第一时间段) echo '<li class="list-unstyled-item d-flex ' . $highlightClass . '">' . $displayDayName . '<span class="ml-auto">' . $times[0] . '</span></li>'; // 如果有第二个时间段,单独输出 if (isset($times[1])) { echo '<li class="list-unstyled-item d-flex ' . $highlightClass . '"><span class="ml-auto">' . $times[1] . '</span></li>'; } } ?> </ul>
关键改进点说明
- 用
foreach遍历关联数组:foreach ($openingHours as $dayName => $times)可以直接拿到每个星期的键名($dayName)和对应的时间数组($times),完美解决显示键名的需求。 - 实现当前日期高亮:通过
$weekDaysMap把星期数字和数组键名关联起来,用array_search找到当前遍历的$dayName对应的数字,和今天的$today对比,匹配就添加highlight-current-day类(你可以自己定义这个类的CSS样式,比如背景色、字体加粗)。 - 友好的星期名称显示:用
ucfirst($dayName)把小写的键名转换成首字母大写的格式(比如sunday→Sunday),更美观。 - 容错性处理:保留了原代码中对第二个时间段的判断,确保只有存在时才输出。
补充CSS高亮样式(可选)
如果你还没定义高亮样式,可以加这段CSS:
.highlight-current-day { background-color: #f0f8ff; font-weight: bold; border-left: 3px solid #2196f3; }
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

