0

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?

4
  • What is the value of $student? Commented Nov 27, 2015 at 22:50
  • is an object of the 'Model' User, I checked it and are 2 students exactly, when I put the if statement that gives no error. The thing is that $student is an array, and inside him I have another array of $contracts Commented Nov 27, 2015 at 22:56
  • It cannot be both a User object and an array at the same time. Is it an array containing two User objects, or something else? Commented Nov 27, 2015 at 22:57
  • I edited the post, I added some code @BenM and yes, is an array of the object Users, they are the result of a query to the database Commented Nov 27, 2015 at 23:04

2 Answers 2

2

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 (i.e. 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
        }
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

thanks man! that worked pretty well. But I still had to put an if statement in the view. I think that is a thing with no choice. Thank you
1

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

2 Comments

sure, I made that too!! Thanks ;)
Usage of supressors (@) isn't really good ways of handling things. That first if-statement would never throw an error, and if you always check that the count is larger than 0, there would be no errors in the foreach-loop either.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.