前一分钟排列一个数组,下一分钟不排列?为foreach()提供的参数无效


Array an array one minute and not the next? Invalid argument supplied for foreach()

由于某种原因,我的代码前一分钟是数组,下一分钟不是。我只是在学习php,我搞不懂。我用这个页面解决了大部分问题:如何在一个页面上添加两个谷歌图表?

我的代码也用于将数据显示为表的页面。在那一页上,它运行得很好。。。。但由于某种原因,我在饼图页面上得到了为foreach()提供的无效参数。。。它说它不是一个数组。我不知道该怎么解决这个问题。

我使用的网址是?action=分数&data=pie,所以它应该在"get_universities()"中列出所有的大学(那里有3所)。

有人能帮忙吗?

交换机:

// Showing scores   
case 'scores':
    // Grab the Uni ID and use the appropriate query
    if (isset($_GET['uni_id']))
    {
        $uni_id = $_GET['uni_id'];
        $uni = get_university($uni_id);
    }
    else
    {
        $uni = get_universities();
    }
    // We have to display this data according to the request
    if (isset($_GET['data']))
    {
        $data = $_GET['data'];
    }
    else
    {
        $data = "table";
    }
    // Display the data accordingly
    include (root . '/view/' . $data . '_view.php');
    break;

饼图:

    // Create the data table.
    <?php foreach ($uni as $uni) : ?>
    var data<?php echo $uni['university_id']; ?> = new google.visualization.DataTable();
    data<?php echo $uni['university_id']; ?>.addColumn('string', 'Area');
    data<?php echo $uni['university_id']; ?>.addColumn('number', 'Score');
    data<?php echo $uni['university_id']; ?>.addRows([
      ['Teaching', <?php echo $uni['teaching_score']; ?>],
      ['Intl Outlook', <?php echo $uni['int_outlook_score']; ?>],
      ['Industry Income', <?php echo $uni['ind_income_score']; ?>],
      ['Research', <?php echo $uni['research_score']; ?>],
      ['Citations', <?php echo $uni['citations_score']; ?>]
    ]);
    <?php endforeach ?>
    // Set chart options
    <?php foreach ($uni as $uni) : ?>
    var options<?php echo $uni['university_id']; ?> = {'title':'<?php echo $uni['university_name']; ?> Scores',
                   'width':400,
                   'height':300};
    <?php endforeach ?>
    // Instantiate and draw our chart, passing in some options.
    <?php foreach ($uni as $uni) : ?>
    var chart<?php echo $uni['university_id']; ?> = new google.visualization.PieChart(document.getElementById('chart_div<?php echo $uni['university_id']; ?>'));
    chart.draw(data<?php echo $uni['university_id']; ?>, options<?php echo $uni['university_id']; ?>);
    <?php endforeach ?>

表格视图(有效):

<?php foreach ($uni as $uni) : ?>
<td>
    <a href="?uni=<?php echo $uni['university_id']; ?>">
        <?php echo $uni['university_name']; ?>
    </a>
</td>
<etc>

问题出在foreach语句上:

foreach ($uni as $uni) :

在这里,您可以覆盖$uni变量。对集合和项目使用不同的名称,例如:

foreach ($uni as $theUni) :
// also change instances of $uni below

编辑

以上是错误的。foreach的第一个参数的解析只发生过一次,所以在foreach不会有问题。然而,foreach并不是一个新的作用域,因此如果您计划重用数组变量,则需要选择一个不同的名称作为迭代器,这样它就不会被重写。

$a = array(); // $a is array
foreach ($a as $a) {
  // $a is element of original $a
}
// $a is the last element of the original $a array
foreach ($a as $a) // Fail, since $a is not an array anymore