我有一个来自数组的PHP foreach,数组由我的数据库提供者通过soap web服务提供给我,所以我无法更改我得到的数组。当没有要返回的元素时,我得到一个空数组,结果为
Warning: Invalid argument supplied for foreach()
循环看起来像
foreach (($point1['return']) as $val)
我在哪里可以使用@来停止此警告,如果我不能,我该怎么办才能关闭php警告。
答案 0 :(得分:18)
隐藏警告不是正确的方法。你应该检查它是否存在并且是一个数组。
if (is_array($point1['return'])) {
foreach ($point1['return'] as $val) {
...
}
}
实际上,关闭警告或使用@操作符不是99%的时间。
解决问题而不是隐藏它。
答案 1 :(得分:6)
foreach()不仅可以通过arrays / also objects使用默认的“所有可见属性”实现或自定义实现来处理traversable而且可以处理iterator接口。
而且,通过肥皂网服务提供“数据库提供程序”是我可以关注(突然)拥有对象/迭代器而不是普通数组的可能性。
因此,如果您要在将变量传递给foreach之前测试存在和数据类型,那么应该考虑不仅要测试is_array()
,还要测试instanceof Traversable
。< / p>
<?php
class Foo implements Iterator {
protected $v = 0;
public function current() { return $this->v; }
public function key() { return $this->v; }
public function next() { ++$this->v; }
public function rewind() { $this->v=0; }
public function valid() { return 10>$this->v; }
}
//$a = array(1,2,3,4);
$a = new Foo;
if( is_array($a) || $a instanceof Traversable ) {
foreach($a as $e) {
echo $e, "\n";
}
}
答案 2 :(得分:5)
空数组不会导致该错误,问题在于您尝试通过不数组的内容进行迭代。您可以使用is_array函数添加支票。
答案 3 :(得分:3)
最好让错误显示,但首先检查输入是否为数组。因此,您可以将foreach包装在if中,如下所示:
if ((is_array($point1)) && (is_array($point1['return']))) {
foreach (($point1['return']) as $val)
...
}
答案 4 :(得分:2)
首先检查一个数组:
if(is_array($point1['return']))
{
...
}
答案 5 :(得分:2)
您还可以将参数显式转换为数组:
foreach ((array) $point1['return'] as $val) {
注意:如果$point1
答案 6 :(得分:1)
检查那是否实际上是一个数组。与is_array();
!!
没有必要压制警告。
事实上,无法抑制无效的参数警告。
答案 7 :(得分:0)
将此粘贴到您的功能文件中:
set_error_handler(function($errno, $errstr){
if(stristr($errstr,'Invalid argument supplied for foreach()')){
return true;
}
return false;
});