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



мне часто случается обрабатывать данные, которые могут быть либо массивом, либо нулевой переменной, и кормить некоторые foreach С этими данными.

$values = get_values();

foreach ($values as $value){
...
}

когда вы кормите foreach с данными, которые не являются массивом, вы получаете предупреждение:

предупреждение: неверный аргумент поставляются для foreach() в […]

предполагая, что это не возможно, чтобы рефакторинг get_values() функция, чтобы всегда возвращать массив (обратная совместимость, недоступный исходный код, независимо от других причин), мне интересно, какой самый чистый и эффективный способ избежать этих предупреждений:

  • литье $values в массиве
  • инициализации $values в массиве
  • упаковка foreach С if
  • другое (пожалуйста, предложите)


1573  


18  

18 ответов:

лично я считаю, что это самый чистый — не уверен, что это самый эффективный, ум!

if (is_array($values) || is_object($values))
{
    foreach ($values as $value)
    {
        ...
    }
}

причина моего предпочтения заключается в том, что он не выделяет пустой массив, когда вам все равно нечего начинать.

Как насчет этого? много чище и все в одну линию.

foreach ((array) $items as $item) {
 // ...
 }

Я обычно использую конструкцию, подобную этой:

/**
 * Determine if a variable is iterable. i.e. can be used to loop over.
 *
 * @return bool
 */
function is_iterable($var)
{
    return $var !== null 
        && (is_array($var) 
            || $var instanceof Traversable 
            || $var instanceof Iterator 
            || $var instanceof IteratorAggregate
            );
}

$values = get_values();

if (is_iterable($values))
{
    foreach ($values as $value)
    {
        // do stuff...
    }
}

обратите внимание, что эта конкретная версия не тестируется, ее вводят непосредственно в SO из памяти.

Edit: добавил проходимым Регистрация

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

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

например, приведение логического значения к массиву (array)bool, будет не результат в пустой массив, а массив с одним элементом содержит логическое значение в виде int:[0=>0] или [0=>1].

я написал небольшой тест, чтобы представить эту проблему.
(Вот это резервное копирование тест в случае, если первый проверить URL-адрес не удается.)

включены тесты для: null,false,true, a class, an array и undefined.


всегда проверяйте входные данные, прежде чем использовать его в foreach. Предложения:

  1. быстрая проверка типа:$array = is_array($var) or is_object($var) ? $var : [] ;
  2. введите массивы намеков в методах перед использованием foreach и С указанием типов возвращаемых
  3. обертывание foreach внутри if
  4. используя try{}catch(){} блоки
  5. проектирование правильного кода / тестирование перед выпуском продукции
  6. для проверки массива на правильность формы можно использовать array_key_exists на определенном ключе,или проверить глубину массива (когда он один !).
  7. всегда извлекать вспомогательные методы в глобальное пространство имен таким образом, чтобы уменьшить дублирование кода

попробуйте это:

//Force array
$dataArr = is_array($dataArr) ? $dataArr : array($dataArr);
foreach ($dataArr as $val) {
  echo $val;
}

;)

$values = get_values();

foreach ((array) $values as $value){
  ...
}

проблема всегда null и литье на самом деле является чистящим решением.

во-первых, каждая переменная должна быть инициализирована. Всегда.
Кастинг-это не вариант.
если get_values (); может возвращать переменную другого типа, это значение должно быть проверено, конечно.

более краткое расширение @Крис кода

function secure_iterable($var)
{
    return is_iterable($var) ? $var : array();
}

foreach (secure_iterable($values) as $value)
{
     //do stuff...
}

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

<?php foreach (secure_iterable($values) as $value): ?>
    ...
<?php endforeach; ?>
foreach ($arr ? $arr : [] as $elem) {
    // Does something 
}

Это не проверяет, является ли он массивом, но пропускает цикл, если переменная равна нулю или пустому массиву.

Если вы используете php7 и хотите обрабатывать только неопределенные ошибки, это самый чистый IMHO

$array = [1,2,3,4];
foreach ( $array ?? [] as $item ) {
  echo $item;
}

Я не уверен, что это так, но эта проблема, похоже, возникает несколько раз при миграции сайтов wordpress или миграции динамических сайтов в целом. Если это так, убедитесь, что хостинг, на который вы переходите, использует ту же версию PHP, что и ваш старый сайт.

Если вы не переносите свой сайт, и это просто проблема, которая возникла, попробуйте обновить PHP 5. Это решает некоторые из этих проблем. Может показаться глупым решением, но сделал трюк для меня.

исключительный случай для этого уведомления происходит, если вы устанавливаете array в null внутри цикла foreach

if (is_array($values))
{
    foreach ($values as $value)
    {
        $values = null;//WARNING!!!
    }
}

Как насчет такого решения:

$type = gettype($your_iteratable);
$types = array(
    'array',
    'object'
);

if (in_array($type, $types)) {
    // foreach code comes here
}

там, кажется, также есть отношение к окружающей среде:

у меня была эта ошибка» недопустимый аргумент, предоставленный foreach () » только в среде dev, но не в prod (я работаю на сервере, а не на localhost).

несмотря на ошибку var_dump указал, что массив был хорошо там (в обоих случаях приложение и dev).

The if (is_array($array)) вокруг foreach ($array as $subarray) решена проблема.

Извините, что я не могу объяснить причину, но так как мне потребовалось некоторое время, чтобы подумайте о решении, которое я думал о том, чтобы лучше поделиться этим в качестве наблюдения.

Я буду использовать комбинацию empty, isset и is_array как

$array = ['dog', 'cat',  'lion'];

if(!empty($array)  && isset($array)  && is_array($array){
//loop
foreach ($array as $values) {
echo $values; 
}
}

используйте функцию is_array, когда вы передадите массив в цикл foreach.

if (is_array($your_variable)) {
  foreach ($your_variable as $item) {
   //your code
}
}

предупреждение недопустимый аргумент, предоставленный для foreach () отображения твитов.
перейдите в раздел » / wp-content / plugins / display-tweets-php «.
Затем вставьте этот код в строку номер 591, он будет работать отлично.

if (is_array($tweets)){  
        foreach ( $tweets as $tweet ) 
    {
        ...
    }
}

Я бы сделал то же самое, что и Энди, но я бы использовал «пустую» функцию.

вот так:

if(empty($yourArray))
{echo"<p>There's nothing in the array.....</p>";}
else
{
foreach ($yourArray as $current_array_item)
  {
    //do something with the current array item here
  } 
}

Выскакивает Ошибка 4 net::ERR_INVALID_ARG­UMENT что делать?

ERR_INVALID_ARGUME­NT как исправить в яндекс и гугл хром браузере?

ERR_INVALID_ARGUME­NT — что делать? Что за ошибка? Как исправить или починить?

Код ошибки: «ERR_INVALID_ARGUM­ENT» появляется в некоторых браузерах не просто так. Основная причина появления данной ошибки — блокировка некоторых функций браузера антивирусной программой. Особенно этим «грешит» Dr. Web.

При появлении этой ошибки браузер перестанет открывать любые страницы, поскольку одна из рабочих функций полностью блокируется. Чтобы устранить ошибку, выполните следующие действия:

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

автор вопроса выбрал этот ответ лучшим

Знаете ответ?

Определено в заголовке <stdexcept>
class invalid_argument;

Свойство определяет тип бросаемого объекта как исключение.Сообщает об ошибках,возникающих из-за того,что значение аргумента не было принято.

Это исключение вызывается std::bitset::bitset и семействами функций std::stoi и std::stof .

Member functions

(constructor)

создает новый объект invalid_argument с данным сообщением
(функция публичного члена)

operator=

заменяет объект invalid_argument
(функция публичного члена)

what

возвращает пояснительную строку
(функция публичного члена)

std::invalid_argument::invalid_argument

invalid_argument( const std::string& what_arg );
(1)
invalid_argument( const char* what_arg );
(2) (since C++11)
(3)
invalid_argument( const invalid_argument& other );
(until C++11)
invalid_argument( const invalid_argument& other ) noexcept;
(since C++11)

1-2) Создает объект исключения с what_arg в качестве пояснительной строки, к которой можно получить доступ через what() .

3) Конструктор копирования. Если *this и other имеют динамический тип std::invalid_argument , то std::strcmp(what(), other.what()) == 0 (начиная с C++11).

Parameters

what_arg explanatory string
other другой объект исключения для копирования

Exceptions

Notes

Поскольку копирование std::invalid_argument не разрешает генерировать исключения, это сообщение обычно хранится внутри как отдельно выделенная строка с подсчетом ссылок. По этой же причине нет конструктора, принимающего std::string&& : ему бы все равно пришлось копировать содержимое.

std::invalid_argument::operator=

invalid_argument& operator=( const invalid_argument& other );
(until C++11)
invalid_argument& operator=( const invalid_argument& other ) noexcept;
(since C++11)

Сопоставляет содержимое с содержимым other . Если *this и other имеют динамический тип std::invalid_argument , то std::strcmp(what(), other.what()) == 0 после присваивания (начиная с C++11).

Parameters

other другой объект исключения для присвоения

Return value

*this.

std::invalid_argument::what

virtual const char* what() const throw();
(until C++11)
virtual const char* what() const noexcept;
(since C++11)

Возвращает пояснительную строку.

Parameters

(none).

Return value

Указатель на завершающуюся нулем строку с пояснительной информацией. Строка подходит для преобразования и отображения в виде std::wstring . Указатель гарантированно действителен, по крайней мере, до тех пор, пока объект исключения, из которого он получен, не будет уничтожен, или пока не будет вызвана неконстантная функция-член (например, оператор присваивания копии) для объекта исключения.

Notes

Реализации разрешены, но не обязаны переопределять what() .

Унаследовано от std::logic_error

Наследуется от std :: exception

Member functions

[virtual]

уничтожает объект исключения
(виртуальная публичная функция-член std::exception )

[virtual]

возвращает пояснительную строку
(виртуальная публичная функция-член std::exception )

Notes

Цель этого типа исключения аналогична условию ошибки std::errc::invalid_argument (выброшенному в std::system_error из функций-членов std::thread ) и связанной константе errno EINVAL .

Example

#include <bitset>
#include <iostream>
#include <stdexcept>
#include <string>
 
int main()
{
    try {
        std::bitset<4>{"012"}; 
    } catch (std::invalid_argument const& ex) {
        std::cout << "#1: " << ex.what() << 'n';
    }
 
    try {
        [[maybe_unused]] int f = std::stoi("ABBA"); 
    } catch (std::invalid_argument const& ex) {
        std::cout << "#2: " << ex.what() << 'n';
    }
 
    try {
        [[maybe_unused]] float f = std::stof("(3.14)"); 
    } catch (std::invalid_argument const& ex) {
        std::cout << "#3: " << ex.what() << 'n';
    }
}

Possible output:


C++

  • std::get_terminate

    Возвращает текущий установленный std::terminate_handler,который может быть нулевым указателем.

  • std::get_unexpected

    Возвращает текущий установленный std::unexpected_handler,который может быть нулевым указателем.

  • std::length_error

    Определяет тип объекта,который будет выброшен в качестве исключения.

  • std::logic_error

    Определяет тип объекта,который будет выброшен в качестве исключения.

IDLE выдает ошибку такого плана:

Traceback (most recent call last):
File "C:/Python34/dodada8.py", line 26, in <module>
openFile.fileOpen(fileName)
File "C:/Python34/dodada8.py", line 11, in fileOpen
fileOpen = open("C:file2_3.txt","w")
OSError: [Errno 22] Invalid argument: 'C:x0cile2_3.txt'

Вот код:

fileName = str(input("Choose of 3 files: file2_1, file2_2, file2_3: "))

class fileConnector:

   def fileOpen(self, fileName):
     if fileName in ("file2_1","file2_2","file2_3"):

       if fileName == "file2_1":
           fileOpen1 = open("C:file2_1.txt","w")
       elif fileName == "file2_2":
           fileOpen1 = open("C:file2_2.txt","w")
       elif fileName == "file2_3":
           fileOpen1 = open("C:file2_3.txt","w")
     else:
       print("File name is wrong")



class fileWriter:

   def fileWrite(self):
        write_str = str(input("Type any message: "))
        fileOpen1.write(write_str)
        fileOpen1.close()



openFile = fileConnector()
openFile.fileOpen(fileName)

writeFile = fileWriter()
writeFile.fileWrite()            

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


  1. dukesov

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


  2. Ganzal

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

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

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


  3. dukesov

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


  4. Ganzal

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

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

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

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

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

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


  5. dukesov

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


  6. Ganzal

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

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

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

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

    должна ли быть в строке запроса вот эта странная последовательность из $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 в режиме отладки. Но у пыха в этом плане все специфично, так что, пока, наверное, рановато. А ежели под виндой работаешь, то вообще задолбаешься это дело поднимать.

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

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Инаугурация новой закусочной состоится завтра где ошибка
  • Инаугурация медведева 2008 ошибка диктора
  • Инаксессибл бут девайс ошибка
  • Ин сайленс ошибка голосового чата

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

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