背景:我從公共IMDB-for-TV API中提取XML對象。我的目標是從這些對象中拉出某些值 - 比如說,每集的標題列表,放入一個數組中,以便我可以用它來做我想做的事。(PHP)通過對象迭代的問題
問題:雖然我可以編寫代碼,它執行的正是我想要的方式,它吐出來的錯誤,因爲它這樣做,所以我知道什麼是錯的與我遍歷我的對象的方式...但我想不出更好的辦法。我真的很喜歡一些建議。
首先,我們來看看我正在處理的對象。
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
)
展現的是包含一個對象「節目列表」,其中包含對象「季節X」,其中包含的對象「插曲Y」,其中包含了後我值的對象 - 「稱號」。所以對於每一集,我想抓住$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
- 如果連續得到兩個錯誤,走了一個賽季,這意味着往上走一個賽季失敗了,因爲我們已經在節目結束了,所以循環結束了。
預期結果:一個整潔,簡單的每集節目名單。 實際結果:空白頁,使用此代碼;什麼都不會返回。當我使用我的最後一個版本的功能,我已經非常愚蠢地刪除,似乎無法重新創建,我做完全符合我想要的全套集 - - 但在每個季節後,三次在結束該文件中,由於調用了不存在的劇集,我得到了「試圖獲取非對象的屬性」錯誤。
問題:什麼是正確的,實用的方式來循環這樣的大對象?我應該在showEpisode函數中使用什麼條件來檢查結果是否存在?
非常感謝任何能夠幫助的人,我已經盡力而爲,Google搜索了很多,但我只是感到困惑。
+1,這是我見過的最好寫的問題!我真的很高興我可以幫助:) – scenia