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

$values = get_values();

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

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

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

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

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


当前回答

首先,每个变量都必须初始化。总是这样。 强制转换不是一个选项。 如果get_values ();可以返回不同类型的变量,当然这个值必须检查。

其他回答

如果get_value()为空,那么定义一个空数组作为回退呢? 我想不出一条最短的路。

$values = get_values() ?: [];

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

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

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

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

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

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

我通常使用类似这样的结构:

/**
 * 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中。

编辑:增加可遍历检查

<?php
 if (isset($_POST['checkbox'])) {
    $checkbox = $_POST['checkbox'];
    foreach ($checkbox as $key) {
       echo $key . '<br>';
    }
}

?>
    <input type="checkbox" name="checkbox[]" value="red">red <br>
    <input type="checkbox" name="checkbox[]" value="green">green <br>