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

Dam*_*mon 1 php arrays object while-loop

这是代码现在的位置:

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

$ themes数组看起来像这样:

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

    [1] => Theme Object
        (
            [id] => 12
            [title] => FakeTheme
        )
)
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*per 9

因为getAllThemes它不是迭代器,所以它应该总是返回非null /非false,从而导致无限循环.你应该使用foreach循环代替:

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


Dan*_*ham 6

你没有使用foreach循环.做这个:

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

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

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

while ($themes = $model->getAllThemes())
Run Code Online (Sandbox Code Playgroud)

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

while (($themes = $model->getAllThemes()) != false)
Run Code Online (Sandbox Code Playgroud)

或者,更清楚地说,这个:

$themes = $model->getAllThemes();
while($themes != false) 
Run Code Online (Sandbox Code Playgroud)

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

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