foreach只返回数组中的最后一项

时间:2013-03-25 19:24:22

标签: php arrays database foreach rotten-tomatoes

我正在尝试从基于来自两个不同表的信息的API中提取数据,然后再循环遍历foreach并将此数据解析到查询中。我已经构建了一系列查询,它们可以获得我正在寻找的确切数据(数组中第一部电影的名称和海报),但是当将这些数据解析为返回一系列电影列表的foreach时,我预定义的变量只会被带回数组中的最终列表,而不是像预期的那样循环遍历它们。

这是我到目前为止所得到的:

处理:

// Get a user's Watchlists from the watchlists table
    $query = "SELECT * FROM watchlists WHERE user_id = " . $profile_info['id']; 
    $watchlist_result = mysql_query($query);
    $watchlists = array();
    while(($row = mysql_fetch_assoc($watchlist_result))) {
        $watchlists[] = $row;
    }

    // Count how many Watchlists a user has
    $watchlist_count = count($watchlists);

    // Echo details of each Watchlist
    echo "<pre>";
    print_r($watchlists);
    echo "</pre>";

    // For each Watchlist, select all of the films it contains and echo them out
    foreach ($watchlists as $key => $films) {
        // Get each Watchlist's ID from the watchlists table
        $watchlist_id = $films['watchlist_id'];
        echo "<pre>";
        print_r($watchlist_id);
        echo "</pre>";

        // Extract films from the watchlist_films table for each Watchlist, based on its unique ID and put them into an array
        $watchlist_film_query = "SELECT * FROM watchlist_films WHERE watchlist_id = " . $watchlist_id;
        $watchlist_film_result = mysql_query($watchlist_film_query);
        $watchlist_films = array();
        while(($row = mysql_fetch_assoc($watchlist_film_result))) {
            $watchlist_films[] = $row;
        }

        // Echo the new array
        echo "<pre>";
        print_r($watchlist_films);
        echo "</pre>";

        // Get the ID of the first film in each Watchlist
        $rt_id = $watchlist_films[0]['film_id'];

        // Echo the ID
        echo "<pre>";
        print_r($rt_id);
        echo "</pre>";

        // Initialise Rotten Tomates API
        include_once('/api/RottenTomatoes.php');

        /* Rotten Tomatoes */
        $rottenTomatoes = new RottenTomatoes('2b2cqfxyazbbmj55bq4uhebs', 10, 'uk');

        // Search Rotten Tomatoes for details on the first film in the array
        $rottenTomatoes->movieSearch($rt_id);

        //echo "<pre>";
        try {
            $result = $rottenTomatoes->getMovieInfo($rt_id);
            //print_r($result);
        } catch (Exception $e) {
            //print_r($e);
        }
        //echo "</pre>";

        // Get poster and name of first movie in array
        $thumbnail = $result['posters']['thumbnail'];
        $first_film_name = $result['title'];

        echo "<pre>";
        print_r($thumbnail);
        echo "</pre>";

        echo "<pre>";
        print_r($first_film_name);
        echo "</pre>";
    }

现在,我想将此信息解析为实际页面,并打印出用户拥有的每个监视列表的所有信息。

输出:

if ($watchlist_count != 0) {?>
                        <ul class="unstyled"><?php
                            foreach($watchlists as $key => $watchlist_item) {?>
                                <li class="well list-item clearfix"><?php

                                    echo "<pre>";
                                    print_r($watchlist_item);
                                    echo "</pre>";

                                    echo "<pre>";
                                    print_r($watchlist_films);
                                    echo "</pre>";

                                    echo "<pre>";
                                    print_r($watchlist_id);
                                    echo "</pre>";

                                    echo "<pre>";
                                    print_r($thumbnail);
                                    echo "</pre>";

                                    echo "<pre>";
                                    print_r($first_film_name);
                                    echo "</pre>";?>

                                    <div class="row-fluid">
                                        <a href="watchlist.php?id=<?php echo $watchlist_item['watchlist_id']; ?>" title="<?php echo $watchlist_item['name']; ?> Watchlist">
                                            <img src="<?php echo $thumbnail; ?>" class="span1 pull-left" alt="<?php echo $first_film_name; ?> poster" title="<?php echo $first_film_name; ?> poster" />
                                        </a>

                                        <div class="span11 movie-info">
                                            <p class="search-title"><a href="watchlist.php?id=<?php echo $watchlist_item['watchlist_id']; ?>" title="<?php echo $watchlist_item['name']; ?> Watchlist"><?php echo $watchlist_item['name']; ?></a></p>

                                            <p class="search-synopsis"><?php echo $watchlist_item['description']; ?></p>
                                        </div>
                                    </div>

                                </li><?php
                            }?>
                        </ul><?php
                    } else {?>
                        <div class="well list-item">
                            You haven't created any Watchlists yet! Why not visit a movie page now and build your first?
                        </div><?php
                    }?>

我遇到的问题是,虽然处理部分完全符合我的要求(即每个监视列表中第一部电影的名称和缩略图),但当我将此信息解析为输出时,仅显示上一个关注列表中第一部电影的名称和海报,如下所示:

Result

1 个答案:

答案 0 :(得分:1)

在处理过程中,您会在foreach的每个循环中覆盖$watchlist_films$thumbnail$first_film_name,因此您只能获取上次运行的数据。

您应该将数据添加回主数组,例如在foreach循环结束时添加:

$films['watchlist_films']=$watchlist_films;
$films['thumbnail']=$thumbnail;
$films['first_film_name']=$first_film_name;

在输出中,您可以访问数据,例如:

$watchlist_item['thumbnail'];
$watchlist_item['first_film_name'];

所以你的处理看起来像这样(缩短):

$query = "SELECT * FROM watchlists WHERE user_id = " . $profile_info['id']; 
$watchlist_result = mysql_query($query);
$watchlists = array();
while(($row = mysql_fetch_assoc($watchlist_result))) {
    $watchlists[] = $row;
}

// For each Watchlist, select all of the films it contains and echo them out
foreach ($watchlists as $key => $films) {
    $watchlist_film_query = "SELECT * FROM watchlist_films WHERE watchlist_id = " . $films['watchlist_id'];
    $watchlist_film_result = mysql_query($watchlist_film_query);
    $watchlist_films = array();

    //You don't need to load all data if you only want the first one:)
    $row = mysql_fetch_assoc($watchlist_film_result)
    $rt_id = $row['film_id'];

    // Initialise Rotten Tomates API
    include_once('/api/RottenTomatoes.php');

    /////Rotten Tomato Call /////
    //===> Rotten Tomatoe API call code goes here <=== //

    //You don't really need the whole films list
    //$films['watchlist_films']=$watchlist_films;
    $films['thumbnail']=$result['posters']['thumbnail'];
    $films['first_film_name']=$result['title'];
}

输出:

if (count($watchlists)> 0) {?>
                    <ul class="unstyled"><?php
                        foreach($watchlists as $key => $watchlist_item) {?>
                            <li class="well list-item clearfix"><?php

                                <div class="row-fluid">
                                    <a href="watchlist.php?id=<?php echo $watchlist_item['watchlist_id']; ?>" title="<?php echo $watchlist_item['name']; ?> Watchlist">
                                        <img src="<?php echo $watchlist_item['thumbnail']; ?>" class="span1 pull-left" alt="<?php echo $first_film_name; ?> poster" title="<?php echo $watchlist_item['first_film_name']; ?> poster" />
                                    </a>

                                    <div class="span11 movie-info">
                                        <p class="search-title"><a href="watchlist.php?id=<?php echo $watchlist_item['watchlist_id']; ?>" title="<?php echo $watchlist_item['name']; ?> Watchlist"><?php echo $watchlist_item['name']; ?></a></p>

                                        <p class="search-synopsis"><?php echo $watchlist_item['description']; ?></p>
                                    </div>
                                </div>

                            </li><?php
                        }?>
                    </ul><?php
                } else {?>
                    <div class="well list-item">
                        You haven't created any Watchlists yet! Why not visit a movie page now and build your first?
                    </div><?php
                }?>

所有未经测试; - )