On this page
Class MapReduce
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.
- Cake\Collection\Iterator\MapReduce implements IteratorAggregate
Properties summary
- 
    $_counterprotectedCount of elements emitted during the Reduce phaseinteger
- 
    $_dataprotectedHolds the original data that needs to be processedTraversable|null
- 
    $_executedprotectedWhether the Map-Reduce routine has been executed already on the databoolean
- 
    $_intermediateprotectedarrayHolds the shuffled results that were emitted from the map phase 
- 
    $_mapperprotectedA callable that will be executed for each record in the original datacallable
- 
    $_reducerprotectedcallable|nullA callable that will be executed for each intermediate record emitted during the Map phase 
- 
    $_resultprotectedHolds the results as emitted during the reduce phasearray
Method Summary
- 
    __construct() publicConstructor
- 
    _execute() protectedRuns 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. 
- 
    emit() publicAppends a new record to the final list of results and optionally assign a key for this record. 
- 
    emitIntermediate() publicAppends a new record to the bucket labelled with $key, usually as a result of mapping a single record from the original data. 
- 
    getIterator() publicReturns an iterator with the end result of running the Map and Reduce phases on the original data 
Method Detail
__construct()source public
__construct( Traversable $data , callable $mapper , callable $reducer = null )Constructor
Example:
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]]Parameters
- 
     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 $reduceroptional null
- 
     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. 
_execute()source protected
_execute( )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.
Throws
LogicExceptionif emitIntermediate was called but no reducer function was provided
emit()source public
emit( mixed $val , string|null $key = null )Appends a new record to the final list of results and optionally assign a key for this record.
Parameters
- 
     mixed $val
- The value to be appended to the final list of results
- 
     string|null $keyoptional null
- and optional key to assign to the value
emitIntermediate()source public
emitIntermediate( mixed $val , string $bucket )Appends a new record to the bucket labelled with $key, usually as a result of mapping a single record from the original data.
Parameters
- 
     mixed $val
- The record itself to store in the bucket
- 
     string $bucket
- the name of the bucket where to put the record
getIterator()source public
getIterator( )Returns an iterator with the end result of running the Map and Reduce phases on the original data
Returns
ArrayIteratorImplementation of
IteratorAggregate::getIterator()
  Properties detail
$_executedsource
protected boolean
Whether the Map-Reduce routine has been executed already on the data
false$_intermediatesource
protected array
Holds the shuffled results that were emitted from the map phase
[]$_mappersource
protected callable
A callable that will be executed for each record in the original data
$_reducersource
protected callable|null
A callable that will be executed for each intermediate record emitted during the Map phase
© 2005–present The Cake Software Foundation, Inc.
Licensed under the MIT License.
CakePHP is a registered trademark of Cake Software Foundation, Inc.
We are not endorsed by or affiliated with CakePHP.
 https://api.cakephp.org/3.8/class-Cake.Collection.Iterator.MapReduce.html