2014-01-29 150 views
1

背景:我從公共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.
  2. 回聲本集的標題。
  3. 如果失敗,增加一個錯誤計數器,並通過增加$賽季++和把$事件計數器回到1
  4. 如果連續得到兩個錯誤,走了一個賽季,這意味着往上走一個賽季失敗了,因爲我們已經在節目結束了,所以循環結束了。

預期結果:一個整潔,簡單的每集節目名單。 實際結果:空白頁,使用此代碼;什麼都不會返回。當我使用我的最後一個版本的功能,我已經非常愚蠢地刪除,似乎無法重新創建,我完全符合我想要的全套集 - - 但在每個季節後,三次在結束該文件中,由於調用了不存在的劇集,我得到了「試圖獲取非對象的屬性」錯誤。

問題:什麼是正確的,實用的方式來循環這樣的大對象?我應該在showEpisode函數中使用什麼條件來檢查結果是否存在?

非常感謝任何能夠幫助的人,我已經盡力而爲,Google搜索了很多,但我只是感到困惑。

+0

+1,這是我見過的最好寫的問題!我真的很高興我可以幫助:) – scenia

回答

2

這看起來像一個foreach循環的工作。

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

或者(或者我應該說最好),把這個列表對象的方法中,用$this取代$xfiles

+0

呃...該死的。這絕對是完美的。這樣一個簡單而優雅的解決方案,我從來沒有想過要這樣做。非常感謝,我很欣賞這個建議,並且我從中學到了一些東西! – GreenTriangle