Laravel 5 Collections: Filtering Collections With (Without Losing Filtered Rejections) partition

The partition
method is similar to the filter
method, in that it allows you to get a subset of a collection based on some truth condition. However, unlike the filter
method, the partition
method does not discard the elements that failed the truth condition. Instead, the partition
method returns an array of two collections, where the left-hand collection contains the elements that passed the truth condition, and the right-hand side contains the elements that failed the truth condition.
The partition
method is useful when used together with PHP's list
function.
Signature
1public function partition(2 $callback3);
Example Use
The following is a trivial example of the partition where we create two partitions, one containing the vowels of a sentence and the other containing the consonants of the sentence. We will then take the results of the partition
method and pass them into PHP's list
function to create two new local variables: $vowels
and $consonants
.
1$string = 'The quick brown fox jumped over the lazy dog.'; 2 3list($vowels, $consonants) = collect(str_split($string))-> 4 partition(function ($char) { 5 $vowels = 'aeiou'; 6 7 return Str::contains( 8 $vowels, 9 mb_strtolower($char)10 );11 });
After the above code has executed, there would be two new local variables containing either the vowels or consonants in the order they appeared in the sentence. However, because of the way the partition
method works, and our conditional, anything that is not a vowel will be contained in the $consonants
collection (including whitespace and other special characters).
Sentence Vowels:
Index | Value |
---|---|
2 | e |
5 | u |
6 | i |
12 | o |
17 | o |
21 | u |
24 | e |
27 | o |
29 | e |
34 | e |
37 | a |
42 | o |
Sentence Consonants:
Index | Value |
---|---|
0 | T |
1 | h |
3 | |
4 | q |
7 | c |
8 | k |
9 | |
10 | b |
11 | r |
13 | w |
14 | n |
15 | |
16 | f |
18 | x |
19 | |
20 | j |
22 | m |
23 | p |
25 | d |
26 | |
28 | v |
30 | r |
31 | |
32 | t |
33 | h |
35 | |
36 | l |
38 | z |
39 | y |
40 | |
41 | d |
43 | g |
44 | . |
partition
With Higher Order Messages
Using The partition
method can also be used with higher order messaging, which allows us to invoke collection methods and access object instance properties using PHP's property accessors syntax. In the reject
section, we created a Product
class that was used to reject all products that were not on sale.
We will do a similar thing in the following example, except we will create two local variables $onSale
and $notOnSale
using the partition
method and the list
function:
1list($onSale, $notOnSale) = collect([ 2 [ 3 'name' => 'Office Chair', 4 'price' => 399.99, 5 'onSale' => false 6 ], 7 [ 8 'name' => 'Desk', 9 'price' => 199.34,10 'onSale' => true11 ]12])->transform(function ($item) {13 $product = new Product;14 $product->name = $item['name'];15 $product->price = $item['price'];16 $product->onSale = $item['onSale'];17 18 return $product;19})->partition->isOnSale();
∎
Thanks for taking the time to read this post! If you found this article useful and want to help support more work like this, please consider sponsoring my work on GitHub, or by checking out some merch.
Sponsor on GitHub Shop Merch