我经常遇到这样的情况:处理可以是数组或空变量的数据,并将这些数据提供给一些foreach。

$values = get_values();

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

当你给foreach提供不是数组的数据时,你会得到一个警告:

警告:在[…]中为foreach()提供的参数无效

假设不可能重构get_values()函数以总是返回一个数组(向后兼容,没有可用的源代码,无论其他原因),我想知道哪种是避免这些警告的最干净和最有效的方法:

将$值转换为数组 初始化数组的$values 用if包foreach 其他(请建议)


当前回答

如果在每个循环中设置数组为空,则会出现此通知的例外情况

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

其他回答

foreach ($arr ?: [] as $elem) {
    // Do something
}

这并不检查它是否是一个数组,但如果变量为null或空数组则跳过循环。

从PHP 7.0更新,你应该使用空合并操作符:

foreach ($arr ?? [] as $elem) {
    // Do something
}

这将解决评论中提到的警告(这里有一个方便的表,比较?:和??输出)。

当你将数组传递给foreach循环时,使用is_array函数。

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

这个警告发生是因为你想要使用的数组是空的,你可以使用下面的条件:

if ($your_array != false){
   foreach ($your_array as $value){
         echo $value['your_value_name'];
    }
}

如果在每个循环中设置数组为空,则会出现此通知的例外情况

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

更简洁的扩展@Kris的代码

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; ?>