Указан неверный аргумент для foreach () - PullRequest
269 голосов
/ 13 апреля 2010

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

$values = get_values();

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

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

Предупреждение. В foreach () указан неверный аргумент в [...]

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

  • Приведение $values к массиву
  • Инициализация $values в массив
  • Упаковка foreach с if
  • Другое (просьба предложить)

Ответы [ 19 ]

1 голос
/ 01 ноября 2017

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

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

if (in_array($type, $types)) {
    // foreach code comes here
}
1 голос
/ 18 января 2016

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

if (is_array($values))
{
    foreach ($values as $value)
    {
        $values = null;//WARNING!!!
    }
}
1 голос
/ 12 июля 2014

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

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

0 голосов
/ 19 марта 2019

Как насчет определения пустого массива как запасного, если get_value() пусто?
Я не могу придумать кратчайшего пути.

$values = get_values() ?: [];

foreach ($values as $value){
  ...
}
0 голосов
/ 22 октября 2017

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

if (is_array($your_variable)) {
  foreach ($your_variable as $item) {
   //your code
}
}
0 голосов
/ 06 октября 2017

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

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

if(!empty($array)  && isset($array)  && is_array($array){
//loop
foreach ($array as $values) {
echo $values; 
}
}
0 голосов
/ 30 сентября 2012

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

вроде так:

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
  } 
}
0 голосов
/ 10 апреля 2015

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

if (is_array($tweets)){  
        foreach ( $tweets as $tweet ) 
    {
        ...
    }
}
0 голосов
/ 22 февраля 2015

Кажется также, что есть отношение к среде:

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

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

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

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

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