Мне часто приходится обрабатывать данные, которые могут быть массивом или нулевой переменной, и снабжать их foreach
этими данными.
$values = get_values();
foreach ($values as $value){
...
}
Когда вы передаете foreach данными, которые не являются массивом, вы получаете предупреждение:
Предупреждение: неверный аргумент указан для foreach () в [...]
Предполагая, что невозможно реорганизовать get_values()
функцию так, чтобы она всегда возвращала массив (обратная совместимость, недоступный исходный код по любой другой причине), мне интересно, какой самый чистый и эффективный способ избежать этих предупреждений:
- Кастинг
$values
в массив - Инициализация
$values
в массив - Заворачивать
foreach
сif
- Другое (пожалуйста, предложите)
$values
это не массив.Ответы:
Лично я считаю, что это самый чистый - не уверен, что это самый эффективный, ум!
Причиной моего предпочтения является то, что он не выделяет пустой массив, когда у вас все равно ничего не начинается.
источник
count()
не надежно. Если вы передаетеcount()
нуль, он возвращает 0. Если вы передаете ему ненулевой аргумент, не являющийся массивом, он возвращает 1. Поэтому невозможноcount()
определить, является ли переменная массивом, когда переменная может быть пустым массивом, или массив, содержащий 1 элемент.if (is_array($values) || $values instanceof Traversable)
.Как насчет этого? много чище и все в одну строчку.
источник
isset()
илиis_array()
или оба, полностью в зависимости от вашего сценария и т. Д.Я обычно использую конструкцию, подобную этой:
Обратите внимание, что эта конкретная версия не тестировалась, она набирается непосредственно в SO из памяти.
Редактировать: добавлен обходной чек
источник
$var instanceof Traversable
. Смотрите здесь . Потому что, например, вы можете использовать элемент SimpleXMLElement , но он не является экземпляром Iterator или IteratorAggregate.is_object($var)
ре. php.net/manual/en/language.oop5.iterations.phpIterator
илиIteratorAggregate
, но это, конечно, только мое мнение и поэтому субъективно (я никогда не использую открытые поля).Пожалуйста, не полагайтесь на приведение в качестве решения , даже если другие предлагают этот вариант как допустимый, чтобы предотвратить ошибку, она может вызвать другую.
Помните: если вы ожидаете, что будет возвращена конкретная форма массива, это может вас не устроить. Для этого требуются дополнительные проверки.
Я написал быстрый тест, чтобы представить эту проблему . (Вот резервный тест на случай, если первый тестовый URL не пройден.)
Включены тесты для:
null
,false
,true
, Aclass
,array
иundefined
.Всегда проверяйте ввод перед использованием в foreach. Предложения:
$array = is_array($var) or is_object($var) ? $var : [] ;
try{}catch(){}
блоковarray_key_exists
определенный ключ или проверить глубину массива (если он один!) .источник
Попробуй это:
;)
источник
Проблема всегда нулевая, и на самом деле Casting является чистящим решением.
источник
Прежде всего, каждая переменная должна быть инициализирована. Всегда.
Кастинг не вариант.
if get_values (); может возвращать переменную другого типа, это значение, конечно, нужно проверить.
источник
$array = (array)null;
вы получите пустой массив. Конечно, это пустая трата памяти ;-)Более краткое расширение кода @ Kris
особенно для использования внутри кода шаблона
источник
return is_iterable($var) ? $var : array($var);
?Если вы используете php7 и хотите обрабатывать только неопределенные ошибки, это самое чистое ИМХО
источник
Это не проверяет, является ли это массивом, но пропускает цикл, если переменная равна нулю или пустой массив.
источник
Я не уверен, так ли это, но эта проблема, по-видимому, возникала несколько раз при миграции WordPress сайтов или вообще динамических сайтов. В этом случае убедитесь, что хостинг, на который вы переходите, использует ту же версию PHP, что и ваш старый сайт.
Если вы не мигрируете свой сайт, и это просто проблема, попробуйте обновить до PHP 5. Это решит некоторые из этих проблем. Может показаться глупым решением, но сделал свое дело для меня.
источник
Исключительный случай для этого уведомления происходит, если вы устанавливаете массив в нуль внутри цикла foreach
источник
Как насчет этого решения:
источник
Предупреждение неверный аргумент предоставлен для
foreach()
отображения твитов. перейти к/wp-content/plugins/display-tweets-php
. Затем вставьте этот код в строку номер 591, он будет работать отлично.источник
if (is_array($_POST['auto'])){ // code }
Кажется также, что есть отношение к окружающей среде:
У меня была ошибка «неверный аргумент предоставлен foreach ()» только в среде разработчика, но не в prod (я работаю на сервере, а не на localhost).
Несмотря на ошибку, var_dump показал, что с массивом все в порядке (в обоих случаях app и dev).
Во
if (is_array($array))
всемforeach ($array as $subarray)
решена проблема.Извините, что я не могу объяснить причину, но, поскольку мне потребовалось некоторое время, чтобы найти решение, я подумал о том, чтобы лучше поделиться этим в качестве наблюдения.
источник
Используйте функцию is_array, когда вы передадите массив в цикл foreach.
источник
Как насчет определения пустого массива как запасного, если
get_value()
он пуст?Я не могу придумать кратчайшего пути.
источник
Я буду использовать комбинацию
empty
,isset
иis_array
какисточник
я бы сделал то же самое, что и Энди, но я бы использовал «пустую» функцию.
вот так:
источник
$yourArray = 1;
попытаться повторить, и вы получите ошибку.empty()
не подходит тест