【问题标题】:Multidimensional Array for JSON structure in PHPPHP中JSON结构的多维数组
【发布时间】:2014-11-12 12:30:16
【问题描述】:

最近我有一些将 mysql 查询结果转换为 json 用于测验系统的经验。查询结果包含一组问题和相关的答案。实现的过程旨在将这些问题和答案放入多维数组中,然后将其转换为 json 以构建测验数据库。我已经准备好使用适用于下面提到的 JSON 结构的 JS 程序(测验模块)。但是为了构建这个结构,我坚持使用以下 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;

预期的 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结构?任何帮助将不胜感激。

更新

正确键中的值是答案键的索引,即如果我们有“正确”:1,则表示答案键的第二个值。来自 MySQL 的答案的正确值为 boolean (TRUE/FALSE)。因此,在将所有答案作为一组答案放入 answers_array_key 之前,应该记住为具有 TRUE 值的答案新分配的索引数组,将该索引数组作为值放入 correct_array_key 中。一个例子:

....
"answers":[0:"some incorrect answer", 1:"a correct answer", 2:"another incorrect answer"],
"correct":1},                      // this is correct answer key
....

希望这将解释上述所需 json 结构的想法。

【问题讨论】:

    标签: php arrays json multidimensional-array mysqli


    【解决方案1】:

    我认为这会产生你想要的结果。

    while ($rows = mysqli_fetch_assoc($result_quiz)) {
        $final_quiz['questions'][]= array(
            'question' => $rows['question'],
            'answers' => array($rows['answers']), 
            'correct'=> $rows['correct']
        );
    }
    

    在您的代码中,您将覆盖该数组的单个元素,而不是附加其他问题

    【讨论】:

    • 查看 json- 我认为你应该附加一个对象,而不是一个数组。
    • 在您的解决方案中,它只打印第一个答案,但给定问题的答案不止一个。此外,“正确”键应与答案集中的正确“answer_key”相同。查看问题的更新部分。
    【解决方案2】:

    您可以尝试使用 php json_encode 命令。 (链接在 php.net -> http://php.net/manual/it/function.json-encode.php

    该链接显示了数组结构的一些示例。在 php.net 上,它说它适用于每种类型的结构(不是资源)。

    编辑:我看到你已经使用了这个命令,但实际输出如何?与您想要的相差多少?

    【讨论】:

    • 感谢您的回复,但我需要将查询结果“正确”(while 循环)放入多维数组中,以获得上述 json 结构。
    • 答案数组的结果不同,即只打印出第一个选项,打印出第一个正确的键。看看我的问题的 UPDATED 部分。我做了一些澄清
    【解决方案3】:

    我相信这会为你解决问题(我使用了一个数组来测试,希望我的问题是正确的)。

    您需要将 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;
    ?>
    

    结果:

    {
        "questions": [{
            "question": "this is a q",
            "answers": ["incorrect", "incorrect1", "incorrect1", "incorrect2", "correct", "incorrect3"],
            "correct": 4
        }, {
            "question": "q1",
            "answers": ["correct", "incorrect", "incorrect1"],
            "correct": 0
        }]
    }
    

    我确实想为这里的命名约定和这段代码所呈现的有点粗鲁的态度道歉,但现在已经很晚了;

    【讨论】:

      【解决方案4】:

      添加一个计数器 $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++;
              }
      

      这会起作用

      【讨论】:

      • 请查看已更新部分问题。
      猜你喜欢
      • 2014-02-01
      • 2021-12-28
      • 2012-12-10
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 2020-06-21
      • 2013-10-27
      • 1970-01-01
      相关资源
      最近更新 更多