我想计算一个游戏中已完成的活动量。例如,我有 "网球"、"板球 "和 "高尔夫 "作为我的游戏,在每个游戏中都有活动和组别。
例如,我有 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。
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();
一个稍短的方法,使用一个 高阶代理信息 在每个组的活动上,导致少了一个嵌套的可调用。
collect($games)->map(function ($item) {
return collect($item->group)->map->activities->sum(function ($item) {
return collect($item)->sum('completed');
});
})->toArray();