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;
}