阵列坏了?不好


Bad array? Bad foreach?

很抱歉对这个话题有很大的无知,但是当我遇到PHP问题时,除了这个网站之外,我真的不知道在哪里看。

我在这里尝试做的是使用预先指定的 ID 从数据库中调用特定电影。但我得到的只是下面第二个和第三个 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;
}

在身体中:

  // 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

尝试添加:

print_r($film->backdrop);

在第二个 foreach() 循环之前。在错误消息之前,它不会是一个数组,或者它将包含零个元素(不允许)。如果还添加:

echo $films_result;

您将能够调试它并完全了解问题所在。如果没有,请在您的问题中发布整个输出。

发生这种情况是因为 - 正如 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
}

你能提供$film的转储吗?该错误告诉您指向无法迭代的对象(很可能为 null)。