Есть отсортированный список вопросов без классификации, и я хочу отсортировать этот список вопросов. Потому что система школы работает так. Я пытался это сделать, но смог это сделать только потому, что мало знал 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'}
]
Искал подобный вопрос, но не нашел. Что мне нужно сделать, чтобы классифицировать вопрос и варианты вопросов отдельно? как в примере выше.
Вы можете использовать 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 и необработанными циклами будет еще меньше.