Почему в массиве 2-й группы есть индекс? - PullRequest
0 голосов
/ 24 октября 2019

Я являюсь массивом, как показано ниже

[
        {
            "id": 1,
            "game_id": 5,
            "user_id": 61,
            "played_level": 1,
            "group": "easy",
            "created_at": "2019-10-24 11:12:02",
            "updated_at": "2019-10-24 11:16:13"
        },
        {
            "id": 3,
            "game_id": 7,
            "user_id": 61,
            "played_level": 1,
            "group": "easy",
            "created_at": "2019-10-24 11:56:04",
            "updated_at": "2019-10-24 11:56:04"
        },
        {
            "id": 4,
            "game_id": 7,
            "user_id": 61,
            "played_level": 3,
            "group": "intermediate",
            "created_at": "2019-10-24 11:58:47",
            "updated_at": "2019-10-24 12:02:02"
        },
        {
            "id": 5,
            "game_id": 10,
            "user_id": 61,
            "played_level": 3,
            "group": "advance",
            "created_at": "2019-10-24 12:03:07",
            "updated_at": "2019-10-24 12:03:07"
        },
        {
            "id": 6,
            "game_id": 11,
            "user_id": 61,
            "played_level": 3,
            "group": "advance",
            "created_at": "2019-10-24 12:18:28",
            "updated_at": "2019-10-24 12:18:28"
        }
    ]

Я хотел бы сохранить в массив по группам, так как вы можете видеть значения циклов foreach для хранения в группе соответственно

foreach($todayTraining->toArray() as $training){

        if($todayTraining[$index]['group'] === 'easy'){
            $gameTraining['easy'][$index]['game_id'] = $todayTraining[$index]['game_id'];
            $gameTraining['easy'][$index]['played_level'] = $todayTraining[$index]['played_level'];
        }
        if($todayTraining[$index]['group'] === 'intermediate'){
            $gameTraining['intermediate'][$index]['game_id'] = $todayTraining[$index]['game_id'];
            $gameTraining['intermediate'][$index]['played_level'] = $todayTraining[$index]['played_level'];
        }
        if($todayTraining[$index]['group'] === 'advance'){
            $gameTraining['advance'][$index]['game_id'] = $todayTraining[$index]['game_id'];
            $gameTraining['advance'][$index]['played_level'] = $todayTraining[$index]['played_level'];
        }
        $index++;     
    }

ВВ результате я получаю следующий массив

"data": {
        "easy": [
            {
                "game_id": 5,
                "played_level": 1
            },
            {
                "game_id": 6,
                "played_level": 2
            },
            {
                "game_id": 7,
                "played_level": 1
            }
        ],
        "intermediate": {
            "3": {
                "game_id": 7,
                "played_level": 3
            }
        },
        "advance": {
            "4": {
                "game_id": 10,
                "played_level": 3
            },
            "5": {
                "game_id": 11,
                "played_level": 3
            }
        }
    }

Вы можете видеть, что в группе easy нет индексов, но в двух других группах есть indexes. Я не уверен, почему это происходит. Есть ли идея, что я могу удалить это. Я был бы очень признателен. Большое вам спасибо

1 Ответ

1 голос
/ 24 октября 2019

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

Поскольку вы используете $index здесь, которое вы увеличиваете в каждой итерации цикла, вы получаете нулевой индекс в первом подмассиве, но затем, когда дело доходит до 2-го и 3-го, онначинается как 3 соотв. 4 уже.

Вы можете исправить это, применив array_values к каждому из под-массивов после того, как вы закончите сбор данных (который просто переиндексирует массив в последовательный индекс, начинающийся с нуля)- или вы не указали явно индекс для начала, но позвольте PHP определить его. Но тогда вам нужно будет присвоить оба значения за один раз, иначе вы будете создавать два новых элемента для идентификатора игры и уровня игры каждый раз.

Поэтому измените свой код таким образом (соответственнодля двух других случаев):

if($todayTraining[$index]['group'] === 'easy'){
  $gameTraining['easy'][] = [
    'game_id' => $todayTraining[$index]['game_id'],
    'played_level' => $todayTraining[$index]['played_level']
  ];
}

Редактировать: Поскольку вы делаете в основном одно и то же во всех трех случаях, вам даже не нужно иметь три разные ветви здесь. Отличительной чертой only является индекс, используемый на первом уровне, простой, промежуточный, продвинутый.

Но поскольку у вас уже есть это значение в переменной,вы можете получить к нему доступ и назначить свой ключ массива первого уровня напрямую - тогда вам больше не нужно никаких ifs, и тело вашего цикла просто становится

$gameTraining[$todayTraining[$index]['group']][] = [
//             ^^^ index dynamically inserted here
  'game_id' => $todayTraining[$index]['game_id'],
  'played_level' => $todayTraining[$index]['played_level']
];
$index++;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...