cakephp/collection
CakePHP Collection offers a powerful, fluent API for working with arrays and traversables. Map, filter, reduce, group, sort, extract, and combine data with immutable-style operations and lazy iteration helpers—ideal for clean data pipelines in PHP apps.
Installation Add the package via Composer:
composer require cakephp/collection
No additional configuration is required—it’s a standalone library.
First Use Case: Basic Collection Creation
Import the Collection class and create a collection from an array:
use Cake\Collection\Collection;
$data = [1, 2, 3, 4, 5];
$collection = new Collection($data);
Where to Look First
src/Collection.php for core methods and src/Collection/CollectionTrait.php for traits.tests/ directory for practical usage patterns.Data Transformation
Use map() to transform data:
$doubled = $collection->map(fn($item) => $item * 2);
Filtering
Filter items with filter() or reject():
$evens = $collection->filter(fn($item) => $item % 2 === 0);
Aggregation
Use reduce() for custom aggregations:
$sum = $collection->reduce(fn($carry, $item) => $carry + $item, 0);
Chaining Chain methods for fluent operations:
$result = $collection
->filter(fn($item) => $item > 2)
->map(fn($item) => $item * 10)
->toArray();
// Laravel: $laravelCollection->map(...);
// CakePHP: $collection->map(...);
$users = User::all()->toCollection();
$formatted = $apiResponse->map(fn($user) => [
'name' => $user['full_name'],
'email' => $user['contact_email']
]);
Immutable Operations
Methods like map() return new collections; original data remains unchanged.
Fix: Assign results to new variables or use ->each() for side effects.
Lazy Loading
Some methods (e.g., lazy()) defer execution until iterated.
Tip: Use toArray() to force evaluation for debugging.
Key-Value Pairs
Collections assume associative arrays for key()/value() methods.
Workaround: Use assoc() or keys()/values() explicitly.
Performance with Large Data
Avoid chaining heavy operations (e.g., nested map() + filter()) on huge datasets.
Tip: Use each() for early termination or batch processing.
->toArray() or ->first() to debug intermediate states.try-catch for custom callbacks:
$collection->map(function($item) {
if ($item->isInvalid()) {
throw new \RuntimeException('Invalid item');
}
return $item->process();
})->catch(function($e) {
logger($e->getMessage());
});
Custom Iterators
Extend Collection or create a decorator:
class CustomCollection extends Collection {
public function customMethod() {
return $this->filter(...)->map(...);
}
}
Global Helpers Add a facade or helper for common operations:
// app/Helpers/CollectionHelper.php
if (!function_exists('transform')) {
function transform($collection, callable $callback) {
return (new Collection($collection))->map($callback);
}
}
Integration with Laravel
Override Laravel’s Collection facade to use CakePHP’s:
// config/app.php
'aliases' => [
'Collection' => Cake\Collection\Collection::class,
];
How can I help you explore Laravel packages today?