PHP数组问题:从日期数组提取当日及后4天到新数组失败
解决5天天气预报日期数组重复的问题
嘿,我看你在开发第一个Web应用,用OpenWeatherMap API做5天预报,结果碰到日期数组全是当天重复值的问题了。咱们来揪出问题根源,然后基于你的原有脚本修改解决它!
问题出在哪?
你原代码的核心问题是:当找到当天的星期条目后,while循环只是一个劲儿把当前的$dv(也就是当天的星期名)往$five_days里塞,完全没往后遍历$day_name数组——指针一直停在当天的位置,自然每次push的都是同一个值。
修改后的代码(基于你的原有逻辑调整)
$day_name = array( 1=>'Monday', 2=>'Tuesday', 3=>'Wednesday', 4=>'Thursday', 5=>'Friday', 6=>'Saturday', 7=>'Sunday'); $day_start = date('N'); $five_days = array(); // 先把数组指针定位到当天的位置 reset($day_name); while (key($day_name) !== $day_start) { next($day_name); } // 开始收集5天的日期 while(count($five_days) < 5) { // 添加当前指针指向的星期名 array_push($five_days, current($day_name)); // 移动指针到下一个,如果到末尾就回到开头(处理周日之后跳周一的情况) next($day_name); if (!current($day_name)) { reset($day_name); } } echo '<pre>'; print_r($five_days); echo '</pre>';
代码逻辑说明
- 定位当天:先用
reset()把数组指针重置到开头,然后循环移动指针,直到找到和$day_start(当前星期的数字键)匹配的位置,这样指针就停在当天的星期名上了。 - 收集5天数据:每次添加当前指针的内容后,用
next()往后移动指针;如果指针走到数组末尾(current()返回false),就用reset()回到开头,完美处理跨周末的情况。 - 终止条件:当
$five_days里有5个元素时,循环停止,避免无限循环。
更简洁的替代方案
如果你不想折腾数组指针,也可以直接通过计算键值来获取日期,逻辑更直观:
$day_name = array( 1=>'Monday', 2=>'Tuesday', 3=>'Wednesday', 4=>'Thursday', 5=>'Friday', 6=>'Saturday', 7=>'Sunday'); $day_start = date('N'); $five_days = array(); for ($i = 0; $i < 5; $i++) { // 计算当前的星期键,模7处理循环,确保不会超出1-7的范围 $current_key = ($day_start + $i - 1) % 7 + 1; $five_days[] = $day_name[$current_key]; } echo '<pre>'; print_r($five_days); echo '</pre>';
这个方法不用操作指针,直接通过数学计算拿到对应的星期名,出错概率更低,也更容易维护。
内容的提问来源于stack exchange,提问作者Rickie Knight
相关产品推荐
相关产品推荐

