PHP @ foreach警告

Dav*_*vid 7 php

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

Warning: Invalid argument supplied for foreach()
Run Code Online (Sandbox Code Playgroud)

循环看起来像

foreach (($point1['return']) as $val) 
Run Code Online (Sandbox Code Playgroud)

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

kap*_*apa 18

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

if (is_array($point1['return'])) {
    foreach ($point1['return'] as $val)  {
         ...
    }
}
Run Code Online (Sandbox Code Playgroud)

PHP is_array()

实际上,关闭警告或使用@运算符并不是99%的正确方法.

解决问题而不是隐藏它.


Vol*_*erK 6

foreach()不仅可以处理数组,可以通过使用默认的"all visible properties"实现或通过traversable/iterator接口的自定义实现来处理对象.
而且,通过肥皂网服务提供"数据库提供程序"是我需要关注(突然)拥有对象/迭代器而不是普通数组的可能性.
因此,如果您要在将变量传递给foreach之前测试存在和数据类型,则不仅要考虑测试,is_array()还要考虑instanceof Traversable.

<?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";
    }
}
Run Code Online (Sandbox Code Playgroud)


Wes*_*orp 5

一个空数组不会导致该错误,问题是您试图通过不是数组的东西进行迭代.您可以使用is_array函数添加检查.