Получение итога заполнено в laravel - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь подсчитать количество выполненных действий в игре. Так, например, у меня есть «Теннис», «Крикет» и «Гольф» в качестве моих игр, и в каждой из этих игр есть занятия и группы.

Так, например, у меня будет 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;
}

Я борюсь как я могу go это сделать. Я тоже использую laravel.

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Вы можете использовать Laravel map () + sum ()

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 голосов
/ 27 мая 2020

Немного более короткий метод, использующий прокси / сообщение более высокого порядка для действий каждой группы, в результате чего на один вложенный вызываемый объект меньше:

collect($games)->map(function ($item) {
  return collect($item->group)->map->activities->sum(function ($item) {
    return collect($item)->sum('completed');
  });
})->toArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...