Могу ли я использовать цикл while для обхода массива объектов? - PullRequest
1 голос
/ 29 июня 2011

Здесь код находится сейчас:

<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 ]

9 голосов
/ 29 июня 2011

Поскольку getAllThemes не является итератором, он должен всегда возвращать ненулевое / не ложное значение, вызывая бесконечный цикл. Вместо этого вы должны использовать цикл foreach:

<?php
foreach ($model->getAllThemes as $themes) {
    echo '<li>' . $themes->id . ' ' . $themes->title . '</li>';
}
?>
6 голосов
/ 29 июня 2011

Вы не используете цикл 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 заполнен допустимым массивом, он не регистрируется в цикле как пустой или ложный.Это всегда правда.Вы на самом деле не ездите на велосипеде ни по одной из тем.Вы просто проверяете, существует ли массив тем и продолжает ли он работать.Он всегда существует, следовательно, бесконечный цикл.

Фактический цикл foreach будет проходить через каждую тему в вашем массиве и позволит вам что-то с ней сделать.Он будет работать так же, как вы ожидаете в коде цикла while.

1 голос
/ 29 июня 2011

Чтение вашего куска кода ....

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

в этом предложении вы делаете следующие шаги

  1. назначить $ themes массив тем (две темы)
  2. оценить, верно ли присвоение (да, оно есть).
  3. выполнить цикл (внутренний код)
  4. вернуться к шагу номер один.

На самом деле в вашем коде бесконечный цикл.

1 голос
/ 29 июня 2011

Вы ищете цикл foreach:

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

Также похоже, что getAllThemes это метод, а не свойство?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...