@Stoble

Почему не работает итерация?

Fatal error: An iterator cannot be used with foreach by reference in D:\OpenServer\domains\Site\index.php on line 20

$query = "SELECT * FROM man_cats";
$result = mysqli_query($connect, $query);

function buildTree($result) {

    $childs = array();

    foreach($result as &$item) {
         $childs[$item['parent_id']][] = &$item;
         unset($item);
    }

    foreach($result as &$item) {
        if (isset($childs[$item['id']])) {
            $item['childs'] = $childs[$item['id']];
        }
    }
    return $childs[0];
}

buildTree($result);


Здесь начинается 20 строчка -
 foreach($result as &$item) {
         $childs[$item['parent_id']][] = &$item;
         unset($item);
    }
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В случае успешного выполнения запросов SELECT, SHOW, DESCRIBE или EXPLAIN mysqli_query() вернёт объект mysqli_result.

Вы пытаетесь работать с этим объектом как с массивом.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@rPman
&$item - убери &, так же не нужно делать unset (а в твоем случае еще беда ты пытаешься в массиве сохранить указатель на item и тут же его удаляешь), у php хороший автосборщик мусора
return $childs[0] ты возвращаешь нулевой элемент собранного массива а остальное очищается? а он там есть? тут может без [0]?
Ответ написан
@Vitsliputsli
Как и написано в ошибке: An iterator cannot be used with foreach by reference - итератор не может использоваться в foreach через ссылку.
mysqli_query возвращает итерируемый объект, т.е. объект, который имеет метод для получения итератора, который знает как итерировать объект. При итерации foreach обращается к соответствующему методу итератора, который возвращает нужное значение. Т.к. это просто значение, а не свойство объекта, обратиться по ссылке к нему не получится.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы