为foreach()提供的参数无效

时间:2010-04-13 13:48:46

标签: php foreach

我经常碰巧处理可以是数组或空变量的数据,并向这些数据提供foreach

$values = get_values();

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

当您使用非数组的数据提供foreach时,会收到警告:

  

警告:[...]

中为foreach()提供的参数无效

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

  • $values投射到数组
  • $values初始化为数组
  • 使用foreach
  • 包装if
  • 其他(请建议)

19 个答案:

答案 0 :(得分:457)

就我个人而言,我发现这是最干净的 - 不确定它是否最有效,请注意!

if (is_array($values) || is_object($values))
{
    foreach ($values as $value)
    {
        ...
    }
}

我偏好的原因是,当你什么都没有开始时,它不会分配一个空数组。

答案 1 :(得分:92)

这个怎么样?更清洁,所有人都是单线。

foreach ((array) $items as $item) {
 // ...
 }

答案 2 :(得分:40)

我通常使用类似于此的构造:

/**
 * 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...
    }
}

请注意,此特定版本未经过测试,直接从内存中输入。

修改:添加了Traversable支票

答案 3 :(得分:13)

请不要依赖于投射作为解决方案, 即使其他人建议将此作为防止错误的有效选项,也可能会导致另一个错误。

请注意:如果您希望返回特定形式的数组,则可能会失败。需要进行更多检查。

  

E.g。将一个布尔值转换为数组(array)bool NOT 会产生一个空数组,但是一个数组包含一个包含布尔值的元素作为int:[0=>0]或{{1 }}

I wrote a quick test to present this problem。 (如果第一个测试网址失败,这里是backup Test。)

包括:[0=>1]nullfalsetrueclassarray的测试。

在foreach中使用之前,请始终测试您的输入。建议:

  1. Quick type checkingundefined
  2. 在使用foreach和Type hinting arrays 之前的方法中
  3. specifying return types
  4. 在if
  5. 中包装foreach
  6. 使用$array = is_array($var) or is_object($var) ? $var : [] ;
  7. 在生产发布之前设计正确的代码/测试
  8. 要针对正确的表单测试数组,您可以对特定键or test the depth of an array (when it is one !)使用try{}catch(){}
  9. 始终以减少重复代码的方式将助手方法提取到全局命名空间中

答案 4 :(得分:8)

试试这个:

//Force array
$dataArr = is_array($dataArr) ? $dataArr : array($dataArr);
foreach ($dataArr as $val) {
  echo $val;
}

答案 5 :(得分:4)

$values = get_values();

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

问题始终为空,而铸造实际上是清洁解决方案。

答案 6 :(得分:3)

首先,必须初始化每个变量。始终。
铸造不是一种选择。
如果get_values();可以返回不同的类型变量,当然必须检查这个值。

答案 7 :(得分:3)

@Kris's code

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

答案 8 :(得分:2)

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

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

答案 9 :(得分:2)

如果您使用的是php7并且只想处理未定义的错误,那么这是最干净的恕我直言

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

答案 10 :(得分:1)

我不确定是否是这种情况但是这个问题似乎在迁移wordpress网站或迁移动态网站时多次发生。如果是这种情况,请确保您要迁移的托管使用与旧站点相同的PHP版本。

如果您没有迁移您的网站,这只是一个问题,请尝试更新到PHP 5.这会解决其中的一些问题。可能看起来像一个愚蠢的解决方案,但对我来说是诀窍。

答案 11 :(得分:1)

如果在foreach循环

中将数组设置为null,则会出现此通知的特殊情况
if (is_array($values))
{
    foreach ($values as $value)
    {
        $values = null;//WARNING!!!
    }
}

答案 12 :(得分:1)

这个解决方案怎么样:

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

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

答案 13 :(得分:0)

为foreach()提供的警告无效参数显示推文。 去&#34; / wp-content / plugins / display-tweets-php&#34;。 然后在第591行插入此代码,它将完美运行。

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

答案 14 :(得分:0)

似乎与环境有关:

我有“无效参数提供foreach()”错误仅在开发环境中,但不是在prod中(我在服务器上工作,而不是localhost)。

尽管出现错误,但var_dump表明数组在那里很好(在app和dev两种情况下)。

if (is_array($array))周围的foreach ($array as $subarray)解决了这个问题。

对不起,我无法解释原因,但由于我花了一段时间才想出一个解决方案,我想更好地分享这个作为观察。

答案 15 :(得分:0)

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

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

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

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

如果get_value()为空,将一个空数组定义为后备该怎么办?
我想不出最短的方法。

$values = get_values() ?: [];

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

答案 18 :(得分:-3)

我会和Andy做同样的事情,但我会使用'空'功能。

像这样:

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
  } 
}