PHP中JSON结构的多维数组

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

最近,我有一些将mysql查询结果转换为json用于测验系统的经验。查询结果包含一组问题及其相关的答案。实现的过程旨在将这些问题和答案放入多维数组中,然后将其转换为json以构建测验数据库。我已经准备好使用JS过程(测验模块),它与下面提到的JSON结构一起工作。但要构建此结构,我必须使用以下php过程:

PHP代码:

$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
    }]
}