PHP中JSON结构的多维数组
最近,我有一些将mysql查询结果转换为json用于测验系统的经验。查询结果包含一组问题及其相关的答案。实现的过程旨在将这些问题和答案放入多维数组中,然后将其转换为json以构建测验数据库。我已经准备好使用JS过程(测验模块),它与下面提到的JSON结构一起工作。但要构建此结构,我必须使用以下php过程: PHP代码:PHP中JSON结构的多维数组,php,arrays,json,multidimensional-array,mysqli,Php,Arrays,Json,Multidimensional Array,Mysqli,最近,我有一些将mysql查询结果转换为json用于测验系统的经验。查询结果包含一组问题及其相关的答案。实现的过程旨在将这些问题和答案放入多维数组中,然后将其转换为json以构建测验数据库。我已经准备好使用JS过程(测验模块),它与下面提到的JSON结构一起工作。但要构建此结构,我必须使用以下php过程: PHP代码: $query = "SELECT s1.question, s2.answers, s2.correct FROM `questions` s1, `answ
$query = "SELECT s1.question, s2.answers, s2.correct
FROM `questions` s1, `answers` s2
WHERE s1.id=s2.questionid AND s1.courseid=".$_POST['courseid']."";
$result = mysqli_query($mysqli, $query) or die ("<b>Select failed:</b> ".mysqli_error($mysqli));
$final_quiz = array();
$final_quiz['introduction'] = "Introduction text goes here";
while ($rows = mysqli_fetch_assoc($result_quiz)) {
$final_quiz['questions']['question'] = $rows['question'];
$final_quiz['questions']['question']['answers'] = array($rows['answers'], "correct"=> $rows['correct']);
}
// convert to JSON
$json = json_encode($final_quiz);
echo $json;
{
"introduction":"Some introductory text here",
"questions":[
{
"question":"Question number one here?",
"answers":["some incorrect answer", "a correct answer", "another incorrect answer"],
"correct":1}, // indicates an array key that is relates to keys in "answers"
...
]
}
如何组织多维数组以获得上述json结构?任何帮助都将不胜感激
更新
正确键中的值是答案键的索引,即如果我们有“correct”:1,则表示答案键的秒值。来自MySQL的答案的正确值为布尔值(真/假)。因此,在将所有答案作为一组答案放入答案数组\u键之前,应该记住为答案新分配的索引数组,并将该索引数组放入正确的数组\u键作为值。例如:
....
"answers":[0:"some incorrect answer", 1:"a correct answer", 2:"another incorrect answer"],
"correct":1}, // this is correct answer key
....
希望这将解释上述所需json结构的想法。您可以尝试使用php json_encode命令。(php.net上的链接->) 该链接显示了数组结构的一些示例。在php.net上,它说它可以处理每种类型的结构(不是资源)
编辑:正如我看到的,您已经使用了这个命令,但是实际输出如何?与您想要的计数器相差多少?添加一个计数器$i,然后尝试以下代码:
$i = 0;
while ($rows = mysqli_fetch_assoc($result_quiz)) {
$final_quiz['questions'][$i] = array(
'question' => $rows['question'],
//'answers' => $rows['answers'], UPDATE THIS LINE
'answers' => array(
'1' => $rows['answers'][1],
'2' => $rows['answers'][2],
'3' => $rows['answers'][3])
// Why I started from index one? if index is consecutive from 0 to n
// will remove the index in JSON, so start indexing from 1 and make some changes in ur code
'correct' => $rows['correct']
);
$i++;
}
这会起作用的我想这会产生你想要的结果
while ($rows = mysqli_fetch_assoc($result_quiz)) {
$final_quiz['questions'][]= array(
'question' => $rows['question'],
'answers' => array($rows['answers']),
'correct'=> $rows['correct']
);
}
在您的代码中,您正在覆盖该数组的单个元素,而不是附加其他问题我相信这将为您解决它(我使用了一个数组进行测试,希望我的问题是正确的) 您需要将foreach循环更改回while循环。 我可能使用了一些不同的命名,您可能需要更改一个或两个名称以匹配您的确切名称:
<?php
$tmp = array (
array("question"=> "this is a q", "answer"=>"incorrect", "correct" => false),
array("question"=> "this is a q", "answer"=>"incorrect1", "correct" => false),
array("question"=> "q1", "answer"=>"correct", "correct" => true),
array("question"=> "q1", "answer"=>"incorrect", "correct" => false),
array("question"=> "q1", "answer"=>"incorrect1", "correct" => false),
array("question"=> "this is a q", "answer"=>"incorrect1", "correct" => false),
array("question"=> "this is a q", "answer"=>"incorrect2", "correct" => false),
array("question"=> "this is a q", "answer"=>"correct", "correct" => true),
array("question"=> "this is a q", "answer"=>"incorrect3", "correct" => false)
);
$QAndA = array();
foreach ($tmp as $t){
if (!isset($QAndA[$t['question']]['answers']))
$QAndA[$t['question']]['answers'] = array();
$QAndA[$t['question']]['answers'][] = $t['answer'];
if ($t['correct'])
$QAndA[$t['question']]['correct'] = count($QAndA[$t['question']]['answers']) -1;
}
foreach ($QAndA as $q => $data){
$final_quiz['questions'][] = (object)array("question" => $q,
"answers" => $data['answers'],
"correct" => $data['correct']);
}
$json = json_encode($final_quiz);
echo $json;
?>
我真的想为这里的命名约定和代码所呈现的有些粗暴的态度道歉,但是现在已经很晚了 感谢您的回复,但我需要将查询结果“正确”(while loop)放入多维数组中,以获得上述json结构。结果在answers数组中不同,即只打印第一个选项和第一个正确的键。看看我问题的更新部分。我对json做了一些澄清——我认为您应该附加一个对象,而不是一个数组。在您的解决方案中,它只打印第一个答案,但对于给定的问题,有不止一个答案。此外,“正确”键应与答案集中的正确“答案键”相同。查看问题的更新部分。请查看问题的更新部分。
{
"questions": [{
"question": "this is a q",
"answers": ["incorrect", "incorrect1", "incorrect1", "incorrect2", "correct", "incorrect3"],
"correct": 4
}, {
"question": "q1",
"answers": ["correct", "incorrect", "incorrect1"],
"correct": 0
}]
}