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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:03:27