Прямо для классификации данных JSON

Есть отсортированный список вопросов без классификации, и я хочу отсортировать этот список вопросов. Потому что система школы работает так. Я пытался это сделать, но смог это сделать только потому, что мало знал PHP.

В файле JSON первая часть — это вопрос, за которым следуют 4 варианта, и вопрос начинается снова.

Количество вопросов не меняется. Всегда 4.

Текущий файл JSON:

$jsonData = '["questionText1","option1","option2","option3","option4","questionText2","option1","option2","option3","option4","questionText3","..."]'; // x150 text

Мой код:

$jsonParse = json_decode($jsonData, true);
foreach ($jsonParse as $json) {
    $cikis[] = array('q' => $json[0]);
}
var_dump($cikis);

Цель:

$jsonData = [
             {'q':'questionText','o1':'option1','o2':'option2','o3':'option3','o4':'option4'},
             {'q':'questionText','o1':'option1','o2':'option2','o3':'option3','o4':'option4'}
            ]

Искал подобный вопрос, но не нашел. Что мне нужно сделать, чтобы классифицировать вопрос и варианты вопросов отдельно? как в примере выше.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
131
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать array_chunk(), чтобы разбить массив на куски одинакового размера:

<?php

$numberOfElementsPerChunk = 5; // 1 question + 4 options

$jsonData = '["questionText1","option1","option2","option3","option4","questionText2","option1-2","option2-2","option3-2","option4-2","questionText3","option1-3","option2-3","option3-3","option4-3","questionText4","option1-4","option2-4","option3-4","option4-4"]';

$jsonParse = json_decode($jsonData, true);

$chunks = array_chunk($jsonParse, $numberOfElementsPerChunk);

$result = [];
foreach ($chunks as $question) {
    $set = [
        'q' => $question[0],
        'o1' => $question[1],
        'o2' => $question[2],
        'o3' => $question[3],
        'o4' => $question[4],        
        ];
    $result[] = $set;
}

print_r(json_encode($result));

Выход:

[{"q":"questionText1","o1":"option1","o2":"option2","o3":"option3","o4":"option4"},{"q":"questionText2","o1":"option1-2","o2":"option2-2","o3":"option3-2","o4":"option4-2"},{"q":"questionText3","o1":"option1-3","o2":"option2-3","o3":"option3-3","o4":"option4-3"},{"q":"questionText4","o1":"option1-4","o2":"option2-4","o3":"option3-4","o4":"option4-4"}]
Ответ принят как подходящий

Вы можете просто использовать array_chunk, чтобы разделить исходные данные на куски по пять элементов, поскольку каждая группа всегда состоит из 1 вопроса + 4 вариантов.

$chunks = array_chunk($jsonParse, 5);

Это даст вам массив из пяти элементов, каждый из которых содержит вопрос в качестве первого элемента [0] и варианты в качестве элементов [1]...[4]. Если вы хотите превратить их в связанные массивы, вы можете сделать это, например, с помощью array_map и array_combine:

$namedChunks = array_map(function($chunk) {
    return array_combine(['q', 'o1', 'o2', 'o3', 'o4'], $chunk);
}, $chunks);

Это даст вам массив с именованными ключами, которые вы можете json_encode($namedChunks) использовать для нужного результата. (Однако ваш пример недействителен в формате JSON!)

Цикл foreach и «ручное» построение связанных массивов также будут работать и, вероятно, будут немного быстрее. У меня есть привычка использовать прямые циклы в коде, где производительность увеличивается (часто вызываемые или с большими данными), и использовать более элегантные функции array_* в пользу более явного и читаемого кода, где сырая производительность меньше. последовательный.

В последнее время я стал более терпимым к array_map и др. Забивал все это foreach пятнадцать с лишним лет. Заставляет кодера, читающего это, чувствовать себя зацикленным на достаточной громкости. Бог знает, что «элегантные» функции были дерьмовыми исполнителями, особенно в эпоху до PHP7. array_map в неправильном месте будет стоить вам дорого. Он все еще делает, например. если вы вызываете метод несколько сотен раз из цикла и он использует array_map вместо foreach для преобразования данных. Тем не менее, чтобы запустить тесты на свежем PHP8, есть надежда, что разрыв между array_*s и необработанными циклами будет еще меньше.

Markus AO 13.12.2020 21:29

Другие вопросы по теме