Плохой массив? Плохой foreach? - PullRequest
0 голосов
/ 16 мая 2011

Извините за огромное незнание этой темы, но я действительно понятия не имею, где искать, кроме этого сайта, когда у меня возникают проблемы с моим PHP.

То, что я пытаюсь сделать здесь, это использоватьзаранее назначенные идентификаторы для вызова определенных фильмов из базы данных.Но все, что я получаю, это сообщение «Недопустимый аргумент для foreach ()» на втором и третьем foreach'ах ниже.

Вот мой код в голове:

//Custom lists of movies to bring in
//New Releases list
 $films_new_releases = array(40805, 46705, 41630, 44564, 39451, 20352, 43933, 49009, 49797, 42194);
 //Most Popular list
 $films_most_popular = array(27205, 16290, 10138, 41733, 37799, 18785, 19995, 17654, 10140, 12162);

//Get information from address bar
$list = $_GET['l'];
if ($list == 'new releases') {
    $list_chosen = $films_new_releases;
}
elseif ($list == 'most popular') {
    $list_chosen = $films_most_popular;
}
else {
    $list_chosen = $films_new_releases;
}

И средиbody:

  // Loop through each film returned
  foreach ($list_chosen as $list_chosen_film) {

    $films_result = $tmdb->getMovie($list_chosen_film);
    $film = json_decode($films_result);

    // Set default poster image to use if film doesn't have one
    $backdrop_url = 'images/placeholder-film.gif';

    // Loop through each poster for current film
    foreach($film->backdrops as $backdrop) {
      if ($backdrop->image->size == 'poster') {
        $backdrop_url = $backdrop->image->url;
      }
    }

    echo '<div class="view-films-film">
        <a href="film.php?id=' . $film->id . '"><img src="' . $backdrop_url . '" alt="' . $film->name . '" /></a>
            <div class="view-films-film-snippet">
                <h2><a href="film.php?id=' . $film->id . '">' . $film->name . '</a></h2>';
    if ($film->certification != null) {
           echo '<img src="images/bbfc-' . strtolower($film->certification) . '.png" alt="" />';
    }
    echo '      <h3>Starring</h3>
                <p>';
    $num_actors = 0;
    foreach ($film->cast as $cast) {
    if ($cast->job == 'Actor') {
      echo '<a href="person.php?id=' . $cast->id . '">' . $cast->name . '</a> ';
      $num_actors++;
      if ($num_actors == 5)
        break;
    }
    echo '      </p>
                <h3>Director</h3>
                <p>';
    foreach ($film->cast as $cast) {
        if ($cast->job == 'Director') {
            echo '<a href="person.php?id=' . $cast->id . '">' . $cast->name . '</a> ';
        }
    }
    echo '      </p>
            </div>
        </div>';
  }
  // End films
  }

Небольшое тестирование, которое я провел, проверяет, что на самом деле содержат $list_chosen, $list_chosen_film, $films_result и $film, печатая их в нижней части страницы.

$list_chosen показывает - Array, $list_chosen_film показывает - 42194, $films_result показывает всю строку JSON, $film показывает - Array.

Ответы [ 3 ]

2 голосов
/ 17 мая 2011

Попробуйте добавить:

print_r($film->backdrop);

перед вторым циклом foreach (). До сообщения об ошибке это не будет массив или он будет содержать ноль элементов (не допускается). Если вы также добавите:

echo $films_result;

вы сможете отладить его и полностью понять, что не так. Если нет, опубликуйте весь вывод в вашем вопросе.

1 голос
/ 16 мая 2011

Это происходит потому, что - как показала PHP ошибка, вы указали неверный параметр для цикла foreach, возможно null или какое-то другое значение.Убедитесь, что вы предоставляете массив для foreach.

Кроме того, каждый раз, когда вы используете foreach, делайте так:

if (count($some_list) > 0) {
    foreach ($some_list as $list_item) {
        // code for each item on the list
    }
} else {
    // code when there is nothing on the list
}

Это гарантирует, что вы не увидите ошибок только потому, чтов списке ничего нет.

РЕДАКТИРОВАТЬ:

На странице документации вы можете найти несколько советов, как избежать таких ошибок, если коллекцияпытаются перебрать пусто.Просто приведите коллекцию к типу array:

foreach ((array) $some_list as $list_item) {
    // code for each item on the list
}
0 голосов
/ 16 мая 2011

Можете ли вы предоставить дамп в $ фильм? Ошибка говорит вам, что вы указываете на объект, который не может быть повторен (скорее всего, ноль).

...