$_intermediate
$_intermediate : array
Holds the shuffled results that were emitted from the map phase
Implements a simplistic version of the popular Map-Reduce algorithm. Acts like an iterator for the original passed data after each result has been processed, thus offering a transparent wrapper for results coming from any source.
__construct(\Traversable $data, callable $mapper, callable|null $reducer = null)
Constructor
Separate all unique odd and even numbers in an array
$data = new \ArrayObject([1, 2, 3, 4, 5, 3]);
$mapper = function ($value, $key, $mr) {
$type = ($value % 2 === 0) ? 'even' : 'odd';
$mr->emitIntermediate($value, $type);
};
$reducer = function ($numbers, $type, $mr) {
$mr->emit(array_unique($numbers), $type);
};
$results = new MapReduce($data, $mapper, $reducer);
Previous example will generate the following result:
['odd' => [1, 3, 5], 'even' => [2, 4]]
\Traversable | $data | the original data to be processed |
callable | $mapper | the mapper callback. This function will receive 3 arguments. The first one is the current value, second the current results key and third is this class instance so you can call the result emitters. |
callable|null | $reducer | the reducer callback. This function will receive 3 arguments. The first one is the list of values inside a bucket, second one is the name of the bucket that was created during the mapping phase and third one is an instance of this class. |
emitIntermediate(mixed $val, string $bucket) : void
Appends a new record to the bucket labelled with $key, usually as a result of mapping a single record from the original data.
mixed | $val | The record itself to store in the bucket |
string | $bucket | the name of the bucket where to put the record |
_execute() : void
Runs the actual Map-Reduce algorithm. This is iterate the original data and call the mapper function for each , then for each intermediate bucket created during the Map phase call the reduce function.
if emitIntermediate was called but no reducer function was provided