VersionPress\Utils\ArrayUtils::mapreduce PHP Метод

mapreduce() публичный статический Метод

$mapFn has signature ($item, $mapEmit) where $item is item from data and $mapEmit is emit function $reduceFn has signature ($key, $items, $reduceEmit) where $key is the key the data are grouped by, $items is the group and $reduce emit is an emit function $mapEmit has signature ($key, $value) where $key is the key the data are grouped by and $value is a transformed item $reduceEmit has signature ($obj) where $obj is the transformed group
public static mapreduce ( $data, $mapFn, $reduceFn ) : array
$data
$mapFn
$reduceFn
Результат array
    public static function mapreduce($data, $mapFn, $reduceFn)
    {
        $mapResult = [];
        $reduceResult = [];
        $mapEmit = function ($key, $value) use(&$mapResult) {
            $mapResult[$key][] = $value;
        };
        $reduceEmit = function ($obj) use(&$reduceResult) {
            $reduceResult[] = $obj;
        };
        foreach ($data as $item) {
            $mapFn($item, $mapEmit);
        }
        foreach ($mapResult as $key => $value) {
            $reduceFn($key, $mapResult[$key], $reduceEmit);
        }
        return $reduceResult;
    }

Usage Example

Пример #1
0
 private function groupBulkActions($changeInfoList)
 {
     $bulkChangeInfoClasses = $this->bulkChangeInfoClasses;
     $groupedChangeInfos = ArrayUtils::mapreduce($changeInfoList, function (TrackedChangeInfo $item, $mapEmit) {
         $key = "{$item->getEntityName()}/{$item->getAction()}";
         $mapEmit($key, $item);
     }, function ($key, $items, $reduceEmit) use($bulkChangeInfoClasses) {
         /** @var TrackedChangeInfo[] $items */
         if (count($items) > 1) {
             $entityName = $items[0]->getEntityName();
             if (isset($bulkChangeInfoClasses[$entityName])) {
                 $reduceEmit(new $bulkChangeInfoClasses[$entityName]($items));
             } else {
                 $reduceEmit($items);
             }
         } else {
             $reduceEmit($items[0]);
         }
     });
     $changeInfos = array();
     foreach ($groupedChangeInfos as $changeInfoGroup) {
         if (is_array($changeInfoGroup)) {
             foreach ($changeInfoGroup as $changeInfo) {
                 $changeInfos[] = $changeInfo;
             }
         } else {
             $changeInfos[] = $changeInfoGroup;
         }
     }
     return $changeInfos;
 }
All Usage Examples Of VersionPress\Utils\ArrayUtils::mapreduce