Table of Contents
You’re fetching products from multiple overlapping API requests. Maybe paginated results, maybe different filters that return some of the same items. You push them all into a collection and end up with duplicates.
There’s a better way than calling unique() at the end.
The Problem with Push
Here’s the naive approach:
$results = collect([]);
// Loop through multiple API calls
foreach ($queries as $query) {
$response = Http::get('/api/products', $query);
foreach ($response->json('data') as $product) {
$results->push($product);
}
}
// Now de-duplicate
$results = $results->unique('id');
This works, but you’re storing duplicates in memory the entire time, then filtering them out at the end. With large datasets, that’s wasteful.
Use Put() with Keys
Instead of push(), use put() with the product ID as the key:
$results = collect([]);
foreach ($queries as $query) {
$response = Http::get('/api/products', $query);
foreach ($response->json('data') as $product) {
// Key by product ID β duplicates auto-overwrite
$results->put($product['id'], $product);
}
}
// No need for unique() β collection is already deduplicated
Now when the same product ID appears twice, the second one overwrites the first. Automatic deduplication during collection, not after.
Why This Is Better
- Constant memory: Each unique product ID only stored once
- No post-processing: Skip the
unique()call entirely - Latest data wins: If data changes between API calls, you keep the freshest version
Don’t Need the Keys?
If you need a sequential array at the end (without the ID keys), just call values():
$results = $results->values();
// Now indexed [0, 1, 2, ...] instead of [123, 456, ...]
Works for Any Unique Identifier
This pattern works for any deduplication scenario:
// Dedup users by email
$users->put($user['email'], $user);
// Dedup orders by order number
$orders->put($order['order_number'], $order);
// Dedup products by SKU
$products->put($product['sku'], $product);
When Push() Is Better
Use push() when:
- You want duplicates (like tracking multiple events)
- You need insertion order preserved without keys
- Items don’t have a natural unique identifier
Otherwise, put() with keys is your friend.
The Takeaway
Stop using push() + unique(). Use put() with a unique key for automatic deduplication during collection. Cleaner code, less memory, same result.

Leave a Reply