我有一个来自数组的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)
实际上,关闭警告或使用@运算符并不是99%的正确方法.
解决问题而不是隐藏它.
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)