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.
Property Summary
- 
        $_counter protected
intCount of elements emitted during the Reduce phase
 - 
        $_data protected
Traversable|nullHolds the original data that needs to be processed
 - 
        $_executed protected
boolWhether the Map-Reduce routine has been executed already on the data
 - 
        $_intermediate protected
arrayHolds the shuffled results that were emitted from the map phase
 - 
        $_mapper protected
callableA callable that will be executed for each record in the original data
 - 
        $_reducer protected
callable|nullA callable that will be executed for each intermediate record emitted during the Map phase
 - 
        $_result protected
arrayHolds the results as emitted during the reduce phase
 
Method Summary
- 
          
__construct() public
Constructor
 - 
          
_execute() protected
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.
 - 
          
emit() public
Appends a new record to the final list of results and optionally assign a key for this record.
 - 
          
emitIntermediate() public
Appends a new record to the bucket labelled with $key, usually as a result of mapping a single record from the original data.
 - 
          
getIterator() public
Returns an iterator with the end result of running the Map and Reduce phases on the original data
 
Method Detail
__construct() ¶ public
__construct(Traversable $data, callable $mapper, callable|null $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|null$reducer optional 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() ¶ protected
_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.
Returns
voidThrows
LogicExceptionif emitIntermediate was called but no reducer function was provided
emit() ¶ public
emit(mixed $val, string|null $key = null): void
      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$key optional and optional key to assign to the value
Returns
voidemitIntermediate() ¶ public
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.
Parameters
- 
                
mixed$val The record itself to store in the bucket
- 
                
string$bucket the name of the bucket where to put the record
Returns
voidgetIterator() ¶ public
getIterator(): ArrayIterator
      Returns an iterator with the end result of running the Map and Reduce phases on the original data
Returns
ArrayIteratorProperty Detail
$_executed ¶ protected
Whether the Map-Reduce routine has been executed already on the data
Type
bool$_intermediate ¶ protected
Holds the shuffled results that were emitted from the map phase
Type
array$_mapper ¶ protected
A callable that will be executed for each record in the original data
Type
callable$_reducer ¶ protected
A callable that will be executed for each intermediate record emitted during the Map phase
Type
callable|null