PHP解析XML节目链接时如何正确获取下一个广播节目标题
问题根源
代码无法获取下一节目标题、输出末尾带Array的核心原因是逻辑写法错误:
foreach循环内的$item是当前遍历到的单个节目节点,写法$item->title.[$line+1]的本质是给当前节目标题字符串拼接非法数组取值语法,完全不是访问下一个节目节点,PHP解析该错误语法时就会输出结果里的Array字样。- 代码仅做了循环计数,没有将XPath查询到的所有节目节点存为可按下标访问的列表,无法通过「当前下标+1」的方式获取下一个节目。
- 潜在问题:代码直接调用
date("YmdHi")取本地时间,未和XML内标注的UTC(+0000)时区节目时间做对齐,容易出现当前节目匹配错误。
修正后的代码
<?php // 对齐时区和XML内的UTC时间统一,避免时间匹配偏差 date_default_timezone_set('UTC'); $url = 'https://hls.airy.tv/airytv/33'; $xml = simplexml_load_file($url); // 先把所有匹配频道的节目存为数组,方便按下标取相邻节点 $programmeList = $xml->xpath('programme[@channel="33"]'); $currentTime = date("YmdHi"); $nowProgramme = null; $nextProgramme = null; foreach($programmeList as $index => $item) { $start = substr((string)$item["start"], 0, -8); $end = substr((string)$item["stop"], 0, -8); if ($currentTime > $start && $currentTime < $end) { $nowProgramme = $item; // 当前不是最后一个节目时,直接取下标+1的节点就是下一个节目 if (isset($programmeList[$index + 1])) { $nextProgramme = $programmeList[$index + 1]; } break; // 找到当前节目即可终止循环,减少无意义遍历 } } if ($nowProgramme) { echo "Now : " . $nowProgramme->title . "<br>"; echo "Next : " . ($nextProgramme ? $nextProgramme->title : "暂无后续节目信息"); } ?>
修正逻辑说明
- 先将XPath匹配到的所有频道节目存为数组,数组下标和节目播出顺序一一对应
- 遍历命中当前播出节目时,直接通过「当前索引+1」取相邻后续节点,就是待播出的下一个节目,不需要额外写复杂查询
- 增加边界判断:如果当前节目是节目单最后一条,不会触发数组越界错误,给出对应提示
- 提前对齐UTC时区,避免本地时区和XML节目时间不匹配导致的节目识别错误
- 命中当前节目后直接终止循环,降低不必要的性能消耗
内容的提问来源于stack exchange,提问作者Myky
相关产品推荐
相关产品推荐

