forAll, partition, slice, and more
In this final video in looking at Doctrine's Collection
interface, and more specifically, the ArrayCollection
implementation of the Collection
interface, we cover the following remaining methods:
forAll()
partition()
get()
indexOf()
slice()
In the previous video we covered methods such as map
and filter
which take a Closure
as the functions argument, and we looked at why although quite scary sounding, when you understand the underlying concept, there is nothing to be afraid of when creating our own Closure
(or functions).
If you are unsure about any of this, I advise you to check out the previous video and the associated show notes where I go into more detail about this concept.
Layman's Guide to Predicate
If there's one thing that frustrates me about software development it's the reliance on computer science textbook speak. If you have a formal comp. sci. background then cool beans, but if you don't this is exactly the sort of techno-babble that can hamper your learning experience, especially if you don't have someone more experienced readily available to ask.
Ok - so there are obvious reasons to using the correct terminology, but telling a beginner that he / she needs to apply a given predicate to every element in our Collection
is making things more complicated than needs be.
Simply - a predicate is a function that returns true
or false
. Easy as that.
We, as developers, define our own function that returns that boolean value.
A quick example would be to imagine we had an array of numbers, 1 to 10.
Our condition (predicate) is that all numbers must be less than 20. Therefore our function could be:
private function isLessThan20($value) {
return (int) $value < 20;
}
We pass in a value, PHP makes sure our $value
is an integer (the (int)
bit), and then checks that the $value
is less than 20. If yes, return true, if no, return false.
Your conditional / function can be more or less complex than this, but the premise is the same - do some logic and return either true or false.
For One forAll
We saw in the previous video how filter
also takes a predicate, and that we get back an array containing those elements that matched our filtering function.
In the case of forAll
however, all of our elements must match the conditional / predicate. If all our elements match the condition then we get back a value of true
, otherwise the outcome of our forAll
would return false
.
In my opinion, the hard part of understanding the more advanced methods of Doctrine's Collection
interface is figuring out the requirements of the method signatures (i.e. wtf is meant by Closure $p
) rather than actually using them.
And, now that you have seen how each can be used, hopefully you will start seeing many places they can be used to good effect.
Remember, any time you are unsure about how these functions are used, don't be afraid to experiment using tools like PHPUnit or a PHPSpec test. That way you can validate your assumptions, ensure your code works as expected, and maintain a high level of code quality.