Инвалид аргумент ошибка

В статье рассмотрены причины ошибки "Invalid argument supplied for foreach in" и способы её решения.

Разрабатывая свой код на PHP, программист может столкнуться с сообщением об ошибке «Invalid argument supplied for foreach in…». После данного сообщения обычно следует указание на её конкретику, к примеру, «/modules/tasks/todo_tasks_sub.php on line 121». Ошибка обычно обусловлена спецификой имеющегося отрезка кода, и требует проверки особенностей использования в нём переменных. Давайте разберём факторы появления ошибки, и как её можно исправить.

Ошибка Invalid argument

Содержание

  1. Причины появления Invalid argument supplied for foreach
  2. Как исправить ошибку «Invalid argument supplied for foreach in»
  3. Ошибка в WordPress
  4. Заключение

Причины появления Invalid argument supplied for foreach

Рассматриваемая ошибка обычно возникает в ситуации, когда переменная, которую foreach пытается выполнить (повторить) не является массивом. К примеру, вы передаёте в цикл не массив, а скаляр, или вы задействуйте двойной массив, и забыли определить, как выбирается индекс.

Давайте допустим, что мы имеем функцию с именем get_user_posts. Эта функция должна возвращать массив комментариев пользователя. Однако если комментариев нет, функция возвращает логическое значение FALSE.

Код PHP

В приведенном выше отрезке кода мы предположили, что переменная $ 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, когда результаты отсутствуют. Если это так, то вы можете добавить следующую проверку в ваш код:

Пример кода PHP

Выше мы используем функцию is_array, чтобы проверить, является ли $posts массивом. И это мы делаем ДО того, как пытаемся зациклить его с помощью конструкции foreach. Как мы уже писали, все зависит от того, каково предназначение вашего скрипта. Добавление проверки is_array неразумно в ситуации, когда есть вопросы о том будет ли переменная массивом. Ведь вы будете скрывать ошибку, которой не должно существовать.

Ошибка в WordPress

Также рассматриваемая ошибка может появляться при работе сайтов на WordPress. Проблема вызвана тем, что WP_Block_Parser выполняет несколько строковых манипуляций с substr () и strlen (), предполагая, что они работают с одиночными байтами, а не с многобайтовыми последовательностями.

Решить ошибку Invalid argument supplied for foreach в WordPress помогает изменение значения настройки mbstring.func_overload на 0 (обычно стоит 2). Сохраните произведённые изменения, и попытайтесь перейти на проблемную ранее страницу.

Если это не помогло, попробуйте скачать Вордпресс 4.9.5, вытянуть из него папку wp-includes, и скопировать в аналогичную папку на вашем хостинге. После этого WordPress может предложить обновить ваши базы данных, соглашайтесь, и всё заработает после очистки кэша.

Заключение

Ошибка «Invalid argument supplied for foreach in…» в коде PHP обычно вызвана переменной, не являющейся массивом. Последнюю пытается выполнить foreach, но безуспешно. Для решения возникшей проблемы можно добавить функцию is_array (она проверит, является ли переменная массивом). Также может порекомендовать общий ознакомительный материал на сайте phpfaq.ru, где детально разобрано, как найти ошибку в созданном вами коде.

rtyu7

0 / 0 / 0

Регистрация: 20.11.2021

Сообщений: 31

1

09.07.2022, 21:19. Показов 644. Ответов 3

Метки c++ (Все метки)


Начал писать программу,которая предлагает пользователю ввести день,месяц,год.Месяц может быть представлен порядковым номером,аббревиатурой или названием.Затем программа возвращает общее количество дней ,истекших с начала года по указанный день включительно.
При вводе аббревиатуры выскакивает исключение:invalid argument по адресу памяти(«invalid stoi argument»).Если ввести число Исключениисключение не возникает.По отладчику видно,что при вводе аббревиатуры функция isalpha возвращает false и выполнение программы переходит к последнему else и после этого появляется исключение.Хотелось бы это исправить.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// ConsoleApplication2.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
 
#include <iostream>
#include <string>
#include <cstring>
#include <cctype>
#include <Windows.h>
using namespace std;
struct Kalendar {
    int nomday;
    int nommes;
    int year;
    string abmes;
    string nazvmes;
};
int day_of_monthes[12]{ 31,28,31,30,31,30,31,31,30,31,30,31 };
string abbr_mes[12]{ "Jan","Feb","Mar","Apr","May","June","Julu","Aug","Sep","Oct","Nov","Dec" };
string nazv_mes[12]{ "Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь" };
 
 
int main()
{
    string str;
    int chislo;
    setlocale(LC_ALL, "Russian");
    SetConsoleCP(1251);
    Kalendar Primer{};
    printf("Введите номер месяцаn");
    int number_m;
    cin >> number_m;
    printf("Введите деньn");
    cin >> str;
    int sum_day;
    int sum_month = 0;
    int index;
    if (isalpha(str[0]))
    {
        if (str.size() <= 3)
        {
            chislo = stoi(str);
                Primer.abmes = str;
                for (int i = 0; i < 12; i++)
                    if (Primer.abmes == abbr_mes[i])
                    {
                        index = i;
                            for (int i = 0; i < index; i++)
                                sum_month = sum_month + day_of_monthes[i];
                        sum_day = sum_month + chislo;
                        cout << sum_day << endl;
                    }
        }
        else
        {
            Primer.nazvmes = str;
        }
    }
    else
    {
        chislo = stoi(str);
        for (int i = 0; i < number_m; i++)
            sum_month = sum_month + day_of_monthes[i];
        sum_day = sum_month + chislo;
        cout << sum_day << endl;
    }
 
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



programmer_08

681 / 439 / 208

Регистрация: 18.10.2020

Сообщений: 1,589

09.07.2022, 21:48

2

ну, если верить ошибке, то просто замените

C++
1
stoi(str)

, на

C++
1
atoi(str.c_str())

ошибка вроде только с аргументов функции stoi()
и вот ещё в качестве дополнения поиск месяца по введённому значений, но можете забить

C++
1
2
3
4
5
6
7
8
9
10
11
12
int ind = atoi(str.c_str());
string month;
if(ind == 0)
   if(str.length() == 3)
      for(int i = 1; i  < 13; i++)
         if(abr_mes[i] == str)
            { ind = i; break;}
 
if(ind == 0)//если не нашли такой аббревиатуры
   month = str;
else
   month = nazv_mes[ind];

только чтобы так делать нужно будет сделать так

C++
1
2
3
int day_of_monthes[12]{ 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
string abbr_mes[12]{ "", "Jan","Feb","Mar","Apr","May","June","Julu","Aug","Sep","Oct","Nov","Dec" };
string nazv_mes[12]{ "", "Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь" };

зато удобнее будет вводить номер месяца.



1



Вездепух

Эксперт CЭксперт С++

10439 / 5708 / 1553

Регистрация: 18.10.2014

Сообщений: 14,106

10.07.2022, 08:44

3

Цитата
Сообщение от programmer_08
Посмотреть сообщение

ну, если верить ошибке, то просто замените

??? Каким образом это поможет исправить ошибку времени выполнения?

Добавлено через 2 минуты

Цитата
Сообщение от rtyu7
Посмотреть сообщение

При вводе аббревиатуры выскакивает исключение

«При вводе аббревиатуры» в какое место? Какой «аббревиатуры»?

Цитата
Сообщение от rtyu7
Посмотреть сообщение

.Если ввести число исключение не возникает.

Не понял. Разумеется, будет исключение, если в stoi передать не число. О чем тогда вопрос?



1



rtyu7

0 / 0 / 0

Регистрация: 20.11.2021

Сообщений: 31

10.07.2022, 10:27

 [ТС]

4

Не понял. Разумеется, будет исключение, если в stoi передать не число. О чем тогда вопрос?

Виноват,протупил.Я аббревиатуру месяца вводил в поле ввода номера месяца(29 строка).А там int.Я так понимаю cin это пропускал и аббревиатура поступала на вход stoi и появлялось исключение.
В исправленном виде программа выглядит так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// ConsoleApplication2.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
 
#include <iostream>
#include <string>
#include <cstring>
#include <cctype>
#include <Windows.h>
using namespace std;
struct Kalendar {
    int nomday;
    int nommes;
    int year;
    string abmes;
    string nazvmes;
};
int day_of_monthes[12]{ 31,28,31,30,31,30,31,31,30,31,30,31 };
string abbr_mes[12]{ "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" };
string nazv_mes[12]{ "January","February","March","April","May","June","July","August","September","October","November","December" };
 
 
int main()
{
    string str;
    int chislo;
    setlocale(LC_ALL, "Russian");
    SetConsoleCP(1251);
    Kalendar Primer{};
    printf("Введите порядковый номер дня месяцаn");
    int number_day;
    cin >> number_day;
    cin.ignore(32767, 'n');
    printf("Введите название месяца,его аббревиатуру или порядковый номерn");
    getline(cin, str);
    int year;
    int sum_day;
    int sum_month = 0;
    printf("Введите годn");
    cin >> year;
    if (year % 4 == 0)
        sum_month = 1;
    int index;
    if (isalpha(str[0]))
    {
        if (str.size() <= 3)
        {
                Primer.abmes = str;
                for (int i = 0; i < 12; i++)
                    if (Primer.abmes == abbr_mes[i])
                    {
                        index = i;
                            for (int i = 0; i < index; i++)
                                sum_month = sum_month + day_of_monthes[i];
                        sum_day = sum_month + number_day;
                        cout << sum_day << endl;
                    }
        }
        else
        {
            Primer.nazvmes = str;
            for (int i = 0; i < 12; i++)
                if (Primer.nazvmes == nazv_mes[i])
                {
                    index = i;
                    for (int i = 0; i < index; i++)
                        sum_month = sum_month + day_of_monthes[i];
                    sum_day = sum_month + number_day;
                    cout << sum_day << endl;
                }
        }
    }
    else
    {
        chislo = stoi(str);
        for (int i = 0; i < chislo-1; i++)
            sum_month = sum_month + day_of_monthes[i];
        sum_day = sum_month + number_day;
        cout << sum_day << endl;
    }
 
}

С английским названиями работает.
Всем кто откликнулся-спасибо.



0



За последние 24 часа нас посетили 11694 программиста и 1188 роботов. Сейчас ищут 208 программистов …


  1. dukesov

    С нами с:
    29 авг 2015
    Сообщения:
    65
    Симпатии:
    0


  2. Ganzal

    Команда форума
    Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.901
    Симпатии:
    968

    проблема в запросе. он неправильно формируется, выполняется с ошибкой и в результате на выходе нет данный которые можно трактовать как массив и итерировать.


  3. dukesov

    С нами с:
    29 авг 2015
    Сообщения:
    65
    Симпатии:
    0


  4. Ganzal

    Команда форума
    Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.901
    Симпатии:
    968

    посмотри что у тебя в строке запроса получается после формирования (напечатай значение переменной $query. кэп)

    Добавлено спустя 33 минуты 42 секунды:
    не надо по личкам прятаться и стесняться того что ты новичок. ничего страшного. сначала с языком знакомятся а потом начинают делать что-то сложное. ведь нужно уметь отлаживать. отладка это сравнение того состояния, которое программа имеет на каждом шаге исполнения с тем состоянием которая она должна иметь на этом этапе исполнения. второе берется из головы программиста.

    не знаешь как напечатать значение переменной $query? вот на выбор три случайных способа:
    print($query);
    echo $query;
    var_dump($query);

    но как я уже заметил — ты неправильно формируешь строку. тебе надо пойти и почитать мануал по работе со строками. и вообще по работе с переменными.


  5. dukesov

    С нами с:
    29 авг 2015
    Сообщения:
    65
    Симпатии:
    0


  6. Ganzal

    Команда форума
    Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.901
    Симпатии:
    968

    не надо оверквотить. я прекрасно знаю что написал в своем посте и тут больше никого кроме нас двоих и нет.

    да, ты понял правильно, и вывел правильно и теперь хотелось бы услышать от тебя какой-нибудь вывод. должно оно работать?

    должна ли быть в строке запроса вот эта странная последовательность из $file[«CATEGORY»] да еще и в двойные кавычки обёрнутая? скуэль в большинстве реализаций строковые литералы ожидает в одинарных кавычках — апострофах. это раз.

    два — ты скорее всего хочешь встроить значение индекса CATEGORY массива лежащего в переменной file, но переменные в строку не так встраиваются. вернее в строку в одинарных кавычках ничего не встраивается. это основа языка пхп.

    три — ты скорее всего хочешь встроить значение индекса CATEGORY массива лежащего в переменной file, но ключи массивов не так встраиваются в строки. для этого используют фигурные скобки. и это тоже основы пхп.

    четыре — ты скорее всего хочешь встроить значение индекса CATEGORY массива лежащего в переменной file, но делаешь это внутри функции и при этом у тебя в этой функции не существует переменной file. ты её не определяешь в области видимости функции, ты её не передаешь как аргумент при вызове функции, и ты её не импортируешь из глобальной области видимости в область видимости функции. её там просто нет. и это будет еще одна ошибка — предупреждение о несуществующем индексе несуществующей переменной. и эта ошибка тоже относится к основам языка пхп.

    что еще нужно сказать чтоб убедить тебя почитать мануал с начала?


  7. dukesov

    С нами с:
    29 авг 2015
    Сообщения:
    65
    Симпатии:
    0


  8. Fell-x27

    Команда форума
    Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.162
    Симпатии:
    1.770
    Адрес:
    :сердА

    Есть четвертый — «watch» в IDE в режиме отладки. Но у пыха в этом плане все специфично, так что, пока, наверное, рановато. А ежели под виндой работаешь, то вообще задолбаешься это дело поднимать.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Инаугурация ресторана лексическая ошибка
  • Инаксессибл бут девайс ошибка
  • Имя этого советского певца знакомо во многих странах вид речевой ошибки
  • Имя этого поэта знакомо во многих странах ошибка
  • Имя элемента управления label 2 содержит ошибки access

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии