2014-01-29 3 views
1

Справочная информация: Я извлекаю XML-объекты из общедоступного API IMDB-for-TV. Моя цель - вытащить определенные ценности из этих объектов - например, список каждого эпизода, помещенный в массив, чтобы я мог делать то, что я хочу с ним.(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 
             ) 

Шоу представляет собой объект, содержащий объект «список эпизодов», который содержит объект «сезон х», который содержит объект «эпизод у», который содержит значение я после - «названия». Поэтому для каждого эпизода я хочу захватить $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. Echo название текущего эпизода.
  3. Если это не удается, увеличьте счетчик ошибок на единицу и увеличьте сезон, увеличив $ season ++ и вернув счетчик $ episode в 1.
  4. Если вы получаете две ошибки подряд, это означает, что вы поднимаетесь вверх сезон потерпел неудачу, потому что мы попали в конец шоу, поэтому цикл заканчивается.

Желаемый результат: Простой, простой список каждого эпизода. Фактический результат: Пустая страница, используя этот код; ничего не возвращается. Когда я использовал свою последнюю версию функции, которую я очень глупо удалил и, похоже, не могу воссоздать, я сделал эхо полный набор эпизодов точно так, как я хотел - но после каждого сезона и три раза в конце файла, я получил ошибки «Попытка получить свойства не-объектов» из-за вызовов к несуществующим эпизодам.

Вопрос: Каков правильный, практичный способ петли через такой большой объект? Какие условия следует использовать в моей функции showEpisode, чтобы проверить, будет ли результат существовать или нет?

Спасибо за тонну всем, кто может помочь, я сделал все возможное и много сделал в Googled, но я просто озадачен.

+0

+1, это лучший письменный вопрос, который я когда-либо видел! Я очень рад, что смог помочь :) – scenia

ответ

2

Это похоже на работу для петли foreach.

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

В качестве альтернативы (или я должен сказать, в идеале), поместить это внутри метода объекта списка и заменить $xfiles с $this.

+0

Ну ... черт! Это работает абсолютно отлично. Такое простое и изящное решение, я никогда не думал делать что-то подобное. Спасибо тонну, я ценю совет, и я действительно чему-то научился! – GreenTriangle

Смежные вопросы