PHP @ foreach警告

时间:2011-11-07 10:42:32

标签: php

我有一个来自数组的PHP foreach,数组由我的数据库提供者通过soap web服务提供给我,所以我无法更改我得到的数组。当没有要返回的元素时,我得到一个空数组,结果为

Warning: Invalid argument supplied for foreach()

循环看起来像

foreach (($point1['return']) as $val) 

我在哪里可以使用@来停止此警告,如果我不能,我该怎么办才能关闭php警告。

8 个答案:

答案 0 :(得分:18)

隐藏警告不是正确的方法。你应该检查它是否存在并且是一个数组。

if (is_array($point1['return'])) {
    foreach ($point1['return'] as $val)  {
         ...
    }
}

PHP is_array()

实际上,关闭警告或使用@操作符不是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;
});