在laravel中获取完成的总数

问题描述 投票:0回答:1

我想计算一个游戏中已完成的活动量。例如,我有 "网球"、"板球 "和 "高尔夫 "作为我的游戏,在每个游戏中都有活动和组别。

例如,我有 Tennis = 5

这里是数据结构。

"Tennis": {
    "group":{
        "Group 1": {
            "name": "Group name 1",
            "activities": {
                "activity 1": {
                    "completed" : 1
                },
                "activity 2": {
                    "completed" : 0
                }
            }
        },
        "Group 2": {
            "name": "Group name 2",
            "activities": {
                "activity 1": {
                    "completed" : 1
                },
                "activity 2": {
                    "completed" : 3
                }
            }
        }
    }
}

"Cricket": {
    "group":{
        "Group 1": {
            "name": "Group name 1",
            "activities": {
                "activity 1": {
                    "completed" : 1
                },
                "activity 2": {
                    "completed" : 0
                }
            }
        },
        "Group 2": {
            "name": "Group name 2",
            "activities": {
                "activity 1": {
                    "completed" : 1
                },
                "activity 2": {
                    "completed" : 3
                }
            }
        }
    }
}

"Golf": {
    "group":{
        "Group 1": {
            "name": "Group name 1",
            "activities": {
                "activity 1": {
                    "completed" : 1
                },
                "activity 2": {
                    "completed" : 0
                }
            }
        },
        "Group 2": {
            "name": "Group name 2",
            "activities": {
                "activity 1": {
                    "completed" : 1
                },
                "activity 2": {
                    "completed" : 3
                }
            }
        }
    }
}

我的代码

$result = [];

foreach($games->getGroups as $key => $group)
{
    foreach($group->getActivites as $code => $activity)
    {
        $result[$code] = $activity->getComplete();
    }
}

return $result;

而在我的Activity.php中

public function getComplete(): float
{
    return $this->complete;
}

我正在苦恼如何去做这件事。我也在使用laravel。

laravel
1个回答
1
投票

你可以利用Laravel 地图() + 和()

collect($games)->map(function($game){
    return collect($game['groups'])->map(function($group){
        return collect($group['activities'])->map(function($activity){
            return $activity['completed'];
        })->sum(); // sum of all the activities
    })->sum(); // sum of all the groups in a game -- this is what you are looking for
})->toArray();

0
投票

一个稍短的方法,使用一个 高阶代理信息 在每个组的活动上,导致少了一个嵌套的可调用。

collect($games)->map(function ($item) {
  return collect($item->group)->map->activities->sum(function ($item) {
    return collect($item)->sum('completed');
  });
})->toArray();
© www.soinside.com 2019 - 2024. All rights reserved.