$puntuacion = [
[ 'name' => 'Pablo', 'date' => '2017-01-01', 'points' => 3]
, [ 'name' => 'Ángel', 'date' => '2017-01-01', 'points' => 2]
, [ 'name' => 'María', 'date' => '2017-01-01', 'points' => 4]
,[ 'name' => 'Pablo', 'date' => '2017-01-01', 'points' => 8]
, [ 'name' => 'Ángel', 'date' => '2017-01-01', 'points' => 12]
, [ 'name' => 'María', 'date' => '2017-01-01', 'points' => 6]
,[ 'name' => 'Pablo', 'date' => '2017-02-01', 'points' => 20]
, [ 'name' => 'Ángel', 'date' => '2017-02-01', 'points' => 15]
, [ 'name' => 'María', 'date' => '2017-02-01', 'points' => 18]
,[ 'name' => 'Pablo', 'date' => '2017-03-01', 'points' => 13]
, [ 'name' => 'Ángel', 'date' => '2017-03-01', 'points' => 20]
, [ 'name' => 'María', 'date' => '2017-03-01', 'points' => 18]
];
//función map y filter
function map($arr,$indice_principal,$indice){
$arr_map = array();
$total = count($arr);
for($i=0;$i<$total;$i++)
{
$arr_map[$i][$indice_principal] = $arr[$i][$indice_principal];
$arr_map[$i][$indice] = $arr[$i][$indice];
}
return $arr_map;
}
//realiza el reduce para calcular el resultado final
function reduce($arr_map,$indice_principal,$indice)
{
$resultado = 0;
$arr_reduce = array();
$total = count($arr_map);
for($i=0;$i<$total;$i++)
{
if (!array_key_exists($arr_map[$i][$indice_principal],$arr_reduce))
{
$arr_reduce[$arr_map[$i][$indice_principal]] = 0;
}
else
{
$arr_reduce[$arr_map[$i][$indice_principal]] += $arr_map[$i][$indice];
}
}
return $arr_reduce;
}
Se que tendría que haber usado clases y que el código fuese más elegante pero lo que he querido es que fuese sencillo de leer y entender. En el ejemplo anterior se ha usado un array multidimensional pero