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

$values = get_values();

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

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

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

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

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


当前回答

从PHP >= 7.1.0开始使用is_iterable

https://www.php.net/manual/en/function.is-iterable.php

if (is_iterable($value)) {
    foreach ($value as $v) {
        ...
    }
}

其他回答

如果你正在使用php7,你只想处理未定义的错误,这是最干净的IMHO

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

为foreach()提供的显示tweet的无效参数警告。 进入/wp-content/plugins/display-tweets-php。 然后把这段代码插入591行,它就能正常运行了。

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

更简洁的扩展@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; ?>

这个解决方案怎么样:

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

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

我将使用empty, isset和is_array的组合as

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

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