我可以使用while循环来遍历对象数组吗?

时间:2011-06-28 20:10:56

标签: php arrays object while-loop

这就是代码现在的位置:

<ul>
    <?php
    while ($themes = $model->getAllThemes()) {
        echo '<li>' . $themes->id . ' ' . $themes->title . '</li>';
    }
    ?>
</ul>

$ themes数组如下所示:

Array
(
    [0] => Theme Object
        (
            [id] => 11
            [title] => NewTheme
        )

    [1] => Theme Object
        (
            [id] => 12
            [title] => FakeTheme
        )
)

当我测试它时,它几乎进入无限循环,所以我猜它不知道数组有多长?我试图避免必须计算数组中的项目,并且我对foreach循环语法非常粗略。

4 个答案:

答案 0 :(得分:9)

由于getAllThemes不是迭代器,因此应该总是返回非null / non-false,从而导致无限循环。您应该使用foreach循环代替:

<?php
foreach ($model->getAllThemes as $themes) {
    echo '<li>' . $themes->id . ' ' . $themes->title . '</li>';
}
?>

答案 1 :(得分:6)

您没有使用foreach循环。这样做:

foreach($model->getAllThemes() as $theme) {
    echo '<li>' . $theme->id . ' ' . $theme->title . '</li>';
}

请注意,在循环内部我使用$theme而不是$themes。这是因为foreach循环从数组中取出顶部项目并将其分配给as之后的变量。在这种情况下as $theme

你目前正在做的是使用while循环,里面有一个赋值。

while ($themes = $model->getAllThemes())

另一种写作方式,可能会让你的问题更加明显,就是:

while (($themes = $model->getAllThemes()) != false)

或者,更清楚的是,这个:

$themes = $model->getAllThemes();
while($themes != false) 

由于$themes由有效数组填充,因此它不会在循环中注册为空或false。这总是如此。你实际上并没有骑自行车穿过任何主题。您只是检查主题数组是否存在,以及是否确实存在循环。它总是存在,因此是无限循环。

实际的foreach循环将遍历数组中的每个主题,并允许您对其执行某些操作。它将更像你在while循环代码中所期望的那样。

答案 2 :(得分:1)

你正在寻找一个foreach循环:

 foreach ($model->getAllThemes() as $themes) {
    echo '<li>' . $themes->id . ' ' . $themes->title . '</li>';
} 

同样看起来getAllThemes是方法,而不是属性?

答案 3 :(得分:1)

阅读你的代码......

while ($themes = $model->getAllThemes){
  // loop stuff
}

在这句话中,您正在执行以下步骤

  1. 为$ themes分配主题数组(两个主题)
  2. 评估作业是否属实(是的,是)。
  3. 做循环内容(内部代码)
  4. 回到第一步。
  5. 您的代码实际上存在无限循环。