Invalid argument supplied for foreach()

摘要: 在使用foreach循环遍历数据之前,经常会遇到数据可能是数组或者null的情况。当将非数组类型的数据传递给foreach时,就会出现警告。本文将介绍一些处理此警告的方法,包括将变量转换为数组、对变量进行初始化、使用条件语句包裹foreach等。

内容

经常会遇到处理既可能是数组又可能是null的数据,并将其传递给foreach循环的情况。下面是一个例子:

1$values = get_values();
2
3foreach ($values as $value){
4  ...
5}

在将一个非数组的数据传递给foreach循环时,会出现如下警告:

1Warning: Invalid argument supplied for foreach() in [...]

除了重新设计get_values()函数始终返回数组(因为向后兼容、无法获取源代码等原因),我们要想办法避免这个警告。以下是一些可以避免警告的方法:

  1. 将变量转换为数组
  2. 对变量进行初始化为数组
  3. 使用条件语句包裹foreach循环
  4. 其他方法(请提出建议)

在上述方法中,以下是我认为最干净的方法,尽管不确定是否是最高效的:

1if (is_array($values) || is_object($values))
2{
3    foreach ($values as $value)
4    {
5        ...
6    }
7}

我之所以更喜欢这种方式,是因为它不会在本来就没有数据的情况下分配一个空数组。

总结

上述提供的所有答案本质上都是通过抑制错误来解决问题。PHP给出的警告是告诉你正在尝试使用错误类型的变量,并且可能存在错误。但是上述提供的所有答案都只是简单地忽略了这条警告。最好的解决办法是在使用变量之前对其进行初始化,并且明确声明返回类型。我们应该问自己,为什么get_values()会返回不是数组的数据?如果没有数据,它为什么不能返回一个空数组呢?理论上是可以做到的。

另外,为了在模板代码中使用,可以使用类似于以下的结构:

1<?php foreach (secure_iterable($values) as $value): ?>
2    ...
3<?php endforeach; ?>

最后,请注意不要过于依赖类型转换作为解决方法。虽然其他答案中提到了将变量强制转换为数组的方法,实际上,这可能会引发另一个错误。当你期望返回特定形式的数组时,可能会出现问题,因此还需要进行更多的检查。

以上就是处理Invalid argument supplied for foreach()警告的一些常见方法,希望对你有帮助。


相关文章推荐