背景:我从公共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;
}
}
我的逻辑是:
期望的结果:每个剧集标题的简洁清单。 实际结果:空白页面,使用此代码;什么都没有回来。当我使用我的最后一个版本的函数时,我已经非常愚蠢地删除了并且似乎无法重新创建,我确实完全按照我想要的方式回显了一整套剧集 - 但是在每个季节之后,还有三个在文件末尾的时间,我得到了“试图获取非对象的属性”错误,因为调用了不存在的剧集。
问题:循环这样的大型对象的正确,实用的方法是什么?我应该在showEpisode函数中使用什么条件来检查结果是否存在?
非常感谢任何可以提供帮助的人,我已经尽了最大的努力并且谷歌搜索了很多,但我只是感到困惑。
答案 0 :(得分:2)
这看起来像是foreach循环的工作。
foreach ($xfiles->list->Season as $season) {
foreach ($season->episode as $episode) {
echo $episode->title . "<br />";
}
}
或者(或者我应该理想地说),将其放在list对象的方法中,并将$xfiles
替换为$this
。