This library (or rather module) was inspired by C#s LINQ library.
However, it is not a full-featured LINQ library. It is only a small subset of the functionality since user-land PHP code cannot fully support all the syntactic sugar. For example, the main feature of LINQ, SQL-like syntax directly in source, is not supported since it would require you to compile/transpile your code, which is not in the scope of this library.
The main idea, however, is to provide a way to iterate over a collection of objects in a more natural/handy way like you can do with IEnumerables in C#.
<?php
declare(strict_types=1);
use Elephox\Collection\Enumerable;
$data = [5, 2, 1, 4, 3];
$arr = Enumerable::from($data);
$arr->orderBy(fn (int $item) => $item)
->select(function (int $item) {
echo $item;
});
// output: 12345
$arr->where(fn (int $item) => $item % 2 === 0)
->select(function (int $item) {
echo $item;
});
// output: 24
echo $arr->aggregate(fn (int $acc, int $item) => $acc + $item, 0);
// output: 15- PHP doesn't support generics. For now, only static analyzers like Psalm can provide full type safety when working with generic collections.
- No extension methods from the
System.Datanamespace are implemented (CopyToDataTable) Castwouldn't make sense in a dynamically typed language, so it is not implemented either. You can useEnumerable::selectto change the type of the values.GroupJoinis not implemented (yet?)- Methods ending with
OrDefaultalways hasnullas the default value. You can, of course, pass your own default value. - PHP has no default comparer for types, so we provide a
DefaultEqualityComparerclass that implements some methods to compare two values. Depending on if an order is required,DefaultEqualityComparer::sameorDefaultEqualityComparer::compareis used if you don't provide a comparer function yourself. LongCountis not implemented since PHP only has one integer typeOfTypeis not implemented since PHP doesn't have genericsToHashSet,ToDictionaryandToLookupare not implemented. Instead, you can convert anEnumerableto native types viatoListandtoArray(whereastoArraykeeps the keys or allows you to pass a key selector function)AsParallelandAsQueryableare not implemented- None of the
System.Xmlextension methods are implemented (Ancestors,Descendants,Elements, etc.) - No read only or immutable interfaces or methods to get them exist (yet?)
TryGetNonEnumeratedCountis not implemented