Разрабатывая свой код на PHP, программист может столкнуться с сообщением об ошибке « Invalid argument supplied for foreach in …». После данного сообщения обычно следует указание на её конкретику, к примеру, «/modules/tasks/todo_tasks_sub.php on line 121». Ошибка обычно обусловлена спецификой имеющегося отрезка кода, и требует проверки особенностей использования в нём переменных. Давайте разберём факторы появления ошибки, и как её можно исправить.
Причины появления Invalid argument supplied for foreach
Рассматриваемая ошибка обычно возникает в ситуации, когда переменная, которую foreach пытается выполнить (повторить) не является массивом. К примеру, вы передаёте в цикл не массив, а скаляр, или вы задействуйте двойной массив, и забыли определить, как выбирается индекс.
Давайте допустим, что мы имеем функцию с именем get_user_posts. Эта функция должна возвращать массив комментариев пользователя. Однако если комментариев нет, функция возвращает логическое значение FALSE.
Пример отрезка кода
В приведенном выше отрезке кода мы предположили, что переменная $ posts всегда будет массивом. Однако, если функция get_user_posts возвращает логическое значение FALSE, то цикл foreach не будет работать, и PHP выведет следующее сообщение об ошибке:
Warning: Invalid argument supplied for foreach() on line 7
Как же решить указанную проблему? Давайте разбираться.
Как исправить ошибку «Invalid argument supplied for foreach in»
Решение зависит от того, для чего предназначен ваш код. То есть, если функция get_user_posts всегда должна возвращать массив, то, очевидно, вам необходимо выяснить, почему она возвращает логическое значение FALSE или значение NULL. Причиной этому может быть несколько вещей:
Не удалось объявить пустой массив «по умолчанию» (default);
Сбой запроса к базе данных;
Массив перезаписывается или сбрасывается. Это часто происходит в скриптах с большим количеством массивов, когда имеются ограничения памяти, а разработчик вынужден сбрасывать массивы, с которыми он или она закончили работу.
Просматривая чей-либо код, мы можем столкнуться с API и функциями, которые возвращают значение FALSE, когда результаты отсутствуют. Если это так, то вы можете добавить следующую проверку в ваш код:
Добавляем проверку в наш код
Выше мы используем функцию is_array, чтобы проверить, является ли $posts массивом. И это мы делаем ДО того, как пытаемся зациклить его с помощью конструкции foreach. Как мы уже писали, все зависит от того, каково предназначение вашего скрипта. Добавление проверки is_array неразумно в ситуации, когда есть вопросы о том будет ли переменная массивом. Ведь вы будете скрывать ошибку, которой не должно существовать.
Ошибка в WordPress
Также рассматриваемая ошибка «Invalid argument supplied for foreach in» может появляться при работе сайтов на WordPress. Проблема вызвана тем, что WP_Block_Parser выполняет несколько строковых манипуляций с substr () и strlen (), предполагая, что они работают с одиночными байтами, а не с многобайтовыми последовательностями.
Решить ошибку Invalid argument supplied for foreach в WordPress помогает изменение значения настройки mbstring.func_overload на 0 (обычно стоит 2). Сохраните произведённые изменения, и попытайтесь перейти на проблемную ранее страницу.
Если это не помогло, попробуйте скачать Вордпресс 4.9.5, вытянуть из него папку wp-includes , и скопировать в аналогичную папку на вашем хостинге. После этого WordPress может предложить обновить ваши базы данных, соглашайтесь, и всё заработает после очистки кэша.
Страница ask_names.php. Запрос имен элементов формы:
Страница task.php. Создание элементов формы:
Страница task_show1.php. Обработка формы, которая сгенерирована здесь — task.php:
Проблема в том, что обработка формы не проходит, потому что появляется ошибка Warning: Invalid argument supplied for foreach() в 4 строке страницы task_show1.php. Даже с помощью isset не проходит обработка, почему-то массив пустой становится. В чем может быть проблема? Как исправить ее?
Неожиданно появилась вот это: «warning: Invalid argument supplied for foreach() in /home/vhosts/*****/httpdocs/includes/menu.inc on line 743. »
вот где эта строка:
// Pull out just the menu items we are going to render so that we // get an accurate count for the first/last classes. foreach ($tree as $data) < if (!$data[‘link’][‘hidden’]) < $items[] = $data; > >
Что делать? гугление не помогло:(
p.s решила проблему! вспомнила, какой модуль недавно ставила. проблема была в dhtml меню. удалила его и все стало в порядке!это конечно не лучший вариант, но оно мне все равно не нужно, как выяснилось:) спасибо всем за помощь!
Drupal 6
Блог
Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Комментарии
forum.listkom.ru — точно где нет
а вы вот так по пробуйте httpdocs/includes/menu.inc on line 743
Войдите или зарегистрируйтесь, чтобы отправлять комментарии
что-то смысл коммента не поняла
Войдите или зарегистрируйтесь, чтобы отправлять комментарии
после чего это вылезло?
А что делали? Модуль писали или модуль поставили? Видимо $tree — не массив, ищите, где забыли array().
У меня такое бывает, когда забываю при разработке модулей, что ‘access arguments’ в элементах меню hook_menu() должен быть массивом. Только там другие функции menu.inc ругаются.
Войдите или зарегистрируйтесь, чтобы отправлять комментарии
я ничего особо не делала. добавила термин таксономии, присвоила им родителя и связанный термин и это прежупреждение сразу появилось
Войдите или зарегистрируйтесь, чтобы отправлять комментарии
верните все взад и смотрите пропала ошибка или нет.. потом таки проще отладчиком посмотреть откуда выплывает ошибка. в вашем случае это неверный аргумент при вызове функции [ru-api=menu_tree_output] menu_tree_output [/ru-api]
Войдите или зарегистрируйтесь, чтобы отправлять комментарии
2 -OC-drupal.org возвращала все назад, конечно. не помогло:( простите, а отладчиком это как? в друпале где-то или в консоли?
Войдите или зарегистрируйтесь, чтобы отправлять комментарии
коммента не поняла
вы в поисковый запрос вставили строчку ошибки с вашим адресом, если его удалить из запроса и искать в гугле без вашего адреса, то вылетает описание ошибки на английском и итальянском языке — на первых 3 страницах поиска.
Войдите или зарегистрируйтесь, чтобы отправлять комментарии
интернетом я пользоваться умею. написалав ведь, что гугление не помогло:( разве писала бы я сюда, если бы смогла справиться сама?
Войдите или зарегистрируйтесь, чтобы отправлять комментарии
решила проблему! вспомнила, какой модуль недавно ставила. проблема была в dhtml меню. удалила его и все стало в порядке!это конечно не лучший вариант, но оно мне все равно не нужно, как выяснилось:)
решила проблему! вспомнила, какой модуль недавно ставила. проблема была в dhtml меню. удалила его и все стало в порядке!это конечно не лучший вариант, но оно мне все равно не нужно, как выяснилось:)
на орге по этому вопросу был патчик кстати.. поиском по вашей ошибке он как раз и находится
Подобная проблема начала вылазить после того как в одном из меню создал несколько родительських пунктов, которые являлись ссылками на страницы с таксономией — taxonomy/term/**
Нашел решение здесь: http://drupal.org/node/483920: в файле modules/dhtml_menu/dhtml_menu.module надо заменить строчку