Get your next remote job on LaraJobs.
Laravel PHP

Fix "Invalid argument supplied for foreach" in PHP & Laravel

Benjamin Crozat
Modified on Nov 23, 2022 0 comments Edit on GitHub
Fix "Invalid argument supplied for foreach" in PHP & Laravel

Why does the “Invalid argument supplied for foreach()” warning occurs?

The “Invalid argument supplied for foreach()” warning occurs when you try to iterate over something other than an array or an object.

On PHP 8+, the warning has been rewritten to “foreach() argument must be of type array|object”.

Whatever version of PHP you’re on, you need to ensure that an array or an object is always passed to foreach.

Use the null coalescing operator

When you cannot be certain that you’ll get an array or null, you can use the null coalescing operator to ensure an array will always be passed to foreach.

foreach ($value ?? [] as $item) {
}

Check if your value is iterable

One of the safest way to go is to use the is_iterable() function. It checks for either:

if (is_iterable($value)) {
foreach ($value as $item) {
}
}

Use Laravel’s collections

If you’re using Laravel, you can use collections to wrap your arrays and work with safer code.

Let’s say you’re refactoring a poor-quality codebase and have to deal with uncertain return values. Wrapping the return value in the collect() helper will ensure that you always get an iterable to loop over.

// The safe collect() helper.
$items = collect(
// The unsafe method.
$foo->getItems()
);
 
// Looping over $items will always work.
foreach ($items as $item) {
//
}

Of course, since you’re using Laravel’s collections, you could refactor to their built-in methods:

$items = collect(
$foo->getItems()
);
 
$items->each(function ($item) {
//
});

Wait, there's more!

1 comment

Albert
Albert 12h ago

I'm using Laravel 11 as an API, along with Breeze, to handle authentication in my application. Overall, the login process works correctly. However, when attempting to submit the login form again, instead of receiving a response, the application automatically redirects me. This is not the desired behavior, as I require a direct response instead of a redirection. Currently, I'm using the following code to manage this process:

$middleware->redirectUsersTo(function ($request) {
if ($request->expectsJson()) {
return response()->json(['message' => 'authenticated.'], 200);
} else {
return '/';
}
});

Get help or share something of value with other readers!

Great deals for enterprise developers
  • ZoneWatcher
    Get instant alerts on DNS changes across all major providers, before your customers notice.
    25% off for 12 months using the promo code CROZAT.
    Try ZoneWatcher for free
  • Quickly build highly customizable admin panels for Laravel projects.
    20% off on the pro version using the promo code CROZAT.
    Try Backpack for free
  • Monitor the health of your apps: downtimes, certificates, broken links, and more.
    20% off the first 3 months using the promo code CROZAT.
    Try Oh Dear for free
  • Keep the customers coming; monitor your Google rankings.
    30% off your first month using the promo code WELCOME30
    Try Wincher for free →
The latest community links
- / -