Collection
The collection provides convenient and unified access to multi-results sets, predominantly returned by builder functions.
All collections also serve as iterators, allowing for looping over them as if they were PHP arrays.
Example
// builder->get() returns a collection
$users = builder::table('users')
->where('status', 1)
->get();
$count = $users->count();
echo "$count users found";
// You can loop over them
foreach ($users as $user) {
echo $user->name;
}Instantiating
$records = $DB->get_records('users');
// Pass any array
$users = new collection($records);
// There's also a shortcut method in case you need a fluent way of creating it
$user_ids = collection::new($records)->pluck('id');
// You can also start from an empty collection and add items later
$users = new collection();
foreach ($records as $record) {
$users->append($record);
}Functions
append()
Use this to add new elements to the collection.
$items = [
[
'id' => 1,
'name' => 'Jack'
], [
'id' => 2,
'name' => 'Jill'
]
];
$col = new collection($items);
$col->append([
'id' => 3,
'name' => 'Jane'
]);If you want to specify a key pass it as the second parameter.
$items = [...];
$col = new collection($items);
$col->append(
[
'id' => 3,
'name' => 'Jane'
],
3
);keys()
Returns the keys of the items
$items = [
1 => [
'id' => 1,
'name' => 'Jack'
],
2 => [
'id' => 2,
'name' => 'Jill'
]
];
$col = new collection($items);
print_r($col->keys());
/* prints
Array(
1,
2
)
count()
You can call this to get the amount of items in the collection. Alternatively you can also use count($collection) as it implements the Countable interface.
$col = new collection([...]);
echo $col->count();
echo count($col);map()
This is the equivalent to array_map(). Pass a Callable which accepts the current item and return an item.
It will return a new collection with the modified items. It won't affect the original collection. Use transform() if you want to modify the original collection.
$col = new collection([...]);
// Pass a Closure
$new_col = $col->map(function ($item) {
// do something with the item
$new_item = ...;
return $new_item;
);map_to()
Accepts either a Callable or a class name. If you supply a Callable it calls it for each item and will use the returned value for it (see map()). If you supply a class name it will create a new instance of the given class for each item and passes the item as the constructor argument.
It will return a new collection with the modified items. It won't affect the original collection. Use transform_to() if you want to modify the original collection.
$col = new collection([...]);
// Pass a Closure
$new_col = $col->map_to(function ($item) {
// do something with the item
$new_item = ...;
return $new_item;
);
// Pass a class name
$new_col = $col->map_to(my_custom_item::class);transform()
This is the equivalent of map() except that it does not return a new collection but will change the items in the collection it's called on.
transform_to()
This is the equivalent of map_to() except that it does not return a new collection but will change the items in the collection it's called on.
pluck()
Plucks is an equivalent to array_column and returns all values of a given key.
$items = [
[
'id' => 1,
'name' => 'Jack'
], [
'id' => 2,
'name' => 'Jill'
]
];
$col = new collection($items);
print_r($col->pluck('id'));
/* prints
Array(
1,
2
)
*/first()
Returns the first item of the collection.
$items = [
[
'id' => 1,
'name' => 'Jack'
], [
'id' => 2,
'name' => 'Jill'
]
];
$col = new collection($items);
print_r($col->first());
/* prints
Array(
[
'id' => 1,
'name' => 'Jack'
]
)
*/all()
Returns all items in the collection. It accepts a boolean argument $with_keys (defaulting to false).
$items = [
1 => [
'id' => 1,
'name' => 'Jack'
],
2 => [
'id' => 2,
'name' => 'Jill'
]
];
$col = new collection($items);
print_r($col->all());
/* prints
Array(
[
'id' => 1,
'name' => 'Jack'
],
[
'id' => 2,
'name' => 'Jill'
]
)
*/
print_r($col->all(true));
/* prints
Array(
[
1 => [
'id' => 1,
'name' => 'Jack'
],
2 => [
'id' => 2,
'name' => 'Jill'
]
]
)
*/item()
Returns a single item identified by key.
$items = [
1 => [
'id' => 1,
'name' => 'Jack'
],
2 => [
'id' => 2,
'name' => 'Jill'
]
];
$col = new collection($items);
print_r($col->item(2));
/* prints
Array(
[
'id' => 2,
'name' => 'Jill'
]
)
*/
to_array()
Converts all items to an array of arrays if possible. Tries to either cast the items or calls to_array() function on the items if it has it.
$item1 = new stdClass();
$item1->id = 1;
$item1->name = 'Jack';
$item1 = new stdClass();
$item1->id = 2;
$item1->name = 'Jill';
$items = [$item1, $item2];
$col = new collection($items);
print_r($col->to_array(2));
/* prints
Array(
[
'id' => 1,
'name' => 'Jack'
],
[
'id' => 2,
'name' => 'Jill'
]
)
*/
JsonSerializable
You can convert a collection to JSON by calling json_encode on it. Internally it will encode the results of to_array() to JSON.
$items = [
1 => [
'id' => 1,
'name' => 'Jack'
],
2 => [
'id' => 2,
'name' => 'Jill'
]
];
$col = new collection($items);
echo(json_encode($col));
/* prints
[{"id":1,"name":"Jack"},{"id":2,"name":"Jill"}]
*/