简体   繁体   中英

error of foreach with empty array

I'm working in Laravel 5 using Blade as motor of templates. I'm passing an array from the controller to the view, and I noticed that when I loop on it using the foreach clausule and the array is empty it gives error, exactly this:

Invalid argument supplied for foreach() 

I had the same error in the controller and I fix it temporaly making:

if(count($student)!=0)

I said temporaly because I don't think it this the best way to do it. The code in the controller is:

foreach($students as $student){
        if(count($student->contracts)!=0)
            foreach($student->contracts as $contract){
                 //something
            }//end foreach
    }//end foreach

I made some operations over the arrays, and then I send them to the view:

return view('myview')->with(['students'=>$students]);

The array is passing to the view correctly. I said is the foreach, beacause earlier I had the database full of registers and it worked fine, but now I have some students that doesn't have contracts and then I got that error. But, in the view I have the same error. So, it's normal? how could I fix it in a better way? why when the array is empty the foreach clausule gives that error?

PHP will not return that warning if the array contained at $student->contracts is empty. It will return it if it is of an invalid type (ie not an array).

Rather than checking the count() of $student->contracts , you'd be better to check if it's actually an array, as follows:

foreach($students as $student)
{
    // Make sure that $student->contracts is actually an array (to bypass errors):
    if( is_array($student->contracts) )
    {
        // Now loop through it:
        foreach( $student->contracts as $contract)
        {
            // Do something here
        }
    }
}

Try this

$people = [
        "Person A", "Person B", "Person C"
];
return view ('pages', compact('people'));

and loop through it like this:

@if (count($people))
    <h3>People:</h3>
    <ul>
        @foreach($people as $person)
            <li>{{ $person }}</li>
        @endforeach
    </ul>
@endif

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM