坏阵列?不好的foreach?

时间:2011-05-16 00:57:58

标签: php arrays json

对于这个话题的巨大无知感到抱歉,但是当我遇到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显示 - {{1 }}

3 个答案:

答案 0 :(得分:2)

尝试添加:

print_r($film->backdrop);

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

echo $films_result;

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

答案 1 :(得分:1)

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

这将确保您不会因为列表中没有任何内容而看到错误。

修改

documentation page上,如果您尝试迭代的集合为空,您可以找到一些提示,以避免此类错误。只需将集合转换为array类型:

foreach ((array) $some_list as $list_item) {
    // code for each item on the list
}

答案 2 :(得分:0)

你能提供一部电影转储吗?该错误告诉您,您指向的是无法迭代的对象(很可能是null)。