PHP @ foreach warning

Hiding the warning is not the right way. You should check whether it exists and is an array.

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

PHP is_array()

Actually, turning off warnings or using the @ operator is not the right way to go 99% of the time.

Solve the problem instead of hiding it.


foreach() can handle not only arrays but also objects by either using the the default "all visible properties" implementation or a custom implementation via the traversable/iterator interface.
And a "DB provider via a soap web service" is something where I'd keep an eye on the possibility of (suddenly) having an object/iterator instead of a plain array.
So, if you're going to test the existence and data type before passing the variable to foreach, you should consider not only testing for is_array() but also for 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";
    }
}

An empty array does not cause that error, the problem is that you are trying to iterate trough something that is not an array. You could add a check using is_array function.

Tags:

Php