(PHP)麻烦迭代对象

时间:2014-01-29 13:40:21

标签: php object

背景:我从公共IMDB-for-TV API中提取XML对象。我的目标是从这些对象中提取某些值 - 例如,每个剧集标题的列表,放入一个数组,以便我可以用它做我想做的事。

问题:虽然我可以编写完全按照我想要的方式执行的代码,但是当它这样做时会吐出错误,所以我知道迭代我的对象的方式有问题。 ..但我无法找到更好的方法。我真的很喜欢一些建议。

首先,我们来看看我正在处理的对象。

SimpleXMLElement Object
(
    [Episodelist] => SimpleXMLElement Object
        (
            [Season] => Array
                (
                    [0] => SimpleXMLElement Object
                        (
                            [episode] => Array
                                (
                                    [0] => SimpleXMLElement Object
                                        (
                                            [epnum] => 1
                                            [seasonnum] => 01
                                            [prodnum] => 101
                                            [airdate] => 1989-07-05
                                            [link] => http://www.tvrage.com/Seinfeld/episodes/305788
                                            [title] => Good News, Bad News
                                        )

                                    [1] => SimpleXMLElement Object
                                        (
                                            [epnum] => 2
                                            [seasonnum] => 02
                                            [prodnum] => 103
                                            [airdate] => 1990-05-31
                                            [link] => http://www.tvrage.com/Seinfeld/episodes/150618
                                            [title] => The Stakeout
                                        )

该节目是一个包含对象“剧集列表”的对象,其中包含对象“season x”,其中包含对象“episode y”,其中包含我之后的值 - “title”。因此,对于每集,我想抓住$this->list->Season[X]->episode[Y]->title

这是我写的功能。它需要两个参数:季节编号和剧集编号。

 public function showEpisode($s,$e) {
    $s = $s - 1; // To compensate for zero-indexing.
    $e = $e - 1; 
    if (!empty($this->list->Season[$s]) && !empty($this->list->Season[$s]->episode[$e])) {
        return $this->list->Season[$s]->episode[$e]->title;     
    } else {
        return 0;
    }

}

我知道它是如何编写的。

无论如何,这是我实际使用它的代码。

 $season = 1;
 $episode = 1;
 $errors = 0;
 while ($errors < 2) {
if ($xfiles->showEpisode($season,$episode)!= 0) {
    echo $xfiles->showEpisode($season,$episode) . "<br />"; 
    $episode++;
    $errors = 0;
} else {
    $errors++;
    $season++;
    $episode = 1;
}
 }

我的逻辑是:

  1. 从第1季第1集开始。
  2. 回应当前剧集的标题。
  3. 如果失败了,请将错误计数器加1,然后通过增加$ season ++并将$ episode counter重新设置为1来上升一个赛季。
  4. 如果连续出现两个错误,则意味着一个赛季失败,因为我们已经到了节目的最后,所以循环结束。
  5. 期望的结果:每个剧集标题的简洁清单。 实际结果:空白页面,使用此代码;什么都没有回来。当我使用我的最后一个版本的函数时,我已经非常愚蠢地删除了并且似乎无法重新创建,我确实完全按照我想要的方式回显了一整套剧集 - 但是在每个季节之后,还有三个在文件末尾的时间,我得到了“试图获取非对象的属性”错误,因为调用了不存在的剧集。

    问题:循环这样的大型对象的正确,实用的方法是什么?我应该在showEpisode函数中使用什么条件来检查结果是否存在?

    非常感谢任何可以提供帮助的人,我已经尽了最大的努力并且谷歌搜索了很多,但我只是感到困惑。

1 个答案:

答案 0 :(得分:2)

这看起来像是foreach循环的工作。

foreach ($xfiles->list->Season as $season) {
    foreach ($season->episode as $episode) {
        echo $episode->title . "<br />"; 
    }
}

或者(或者我应该理想地说),将其放在list对象的方法中,并将$xfiles替换为$this