在PHP中返回复杂JSON结构


Returning Complex JSON structure in PHP

我正在编写一个PHP脚本,它可以以以下格式返回一个JSON文件。我想通过从数据库表中获取数据来创建这个结构。我正在使用SlickQuiz插件,很难在问题对象内创建对象数组(即选项)…

{
    "info": {
        "name":    "This is Exam name",
        "main":    "Find out with this super crazy knowledge",
        "results": "Get ready",
        "level1":  "Result Poor",
        "level2":  "Result Average",
        "level3":  "Result Good",
        "level4":  "Result Very Good",
        "level5":  "Result Great" 
    },
    "questions": [
            "q": "Which is the letter A in the English alphabet?",
            "a": [
                {"option": "8",      "correct": false},
                {"option": "14",     "correct": false},
                {"option": "1",      "correct": true},
                {"option": "23",     "correct": false} 
            ],
            "correct": "This is correct",
            "incorrect": "It's the first letter of the alphabet."
        },
        { 
            "q": "Eureka Which of the following best represents your preferred breakfast?",
            "a": [
                {"option": "Bacon and eggs",               "correct": false},
                {"option": "Fruit, oatmeal, and yogurt",   "correct": true},
                {"option": "Leftover pizza",               "correct": false},
                {"option": "Eggs, fruit, toast, and milk", "correct": true} 
            ],
            "select_any": true,
            "correct": "<p><span>Nice!</span> Your cholestoral level is probably doing alright.</p>",
            "incorrect": "<p><span>Hmmm.</span> You might want to reconsider your options.</p>"
        },
        { 
            "q": "Eureka Where are you right now? Select ALL that apply.",
            "a": [
                {"option": "Planet Earth",           "correct": true},
                {"option": "Pluto",                  "correct": false},
                {"option": "At a computing device",  "correct": true},
                {"option": "The Milky Way",          "correct": true} 
            ],
            "correct": "<p><span>Brilliant!</span> You're seriously a genius, (wo)man.</p>",
            "incorrect": "<p><span>Not Quite.</span> You're actually on Planet Earth, in The Milky Way, At a computer. But nice try.</p>" 
        },
        { 
            "q": "How many Eureka of rain does Michigan get on average per year?",
            "a": [
                {"option": "149",    "correct": false},
                {"option": "32",     "correct": true},
                {"option": "3",      "correct": false},
                {"option": "1291",   "correct": false} 
            ],
            "correct": "<p><span>Eureka bananas!</span> I didn't actually expect you to know that! Correct!</p>",
            "incorrect": "<p><span>Fail.</span> Sorry. You lose. It actually rains approximately 32 inches a year in Michigan.</p>"
        },
        { 
            "q": "Is Earth bigger than a basketball?",
            "a": [
                {"option": "Yes",    "correct": true},
                {"option": "No",     "correct": false} 
            ],
            "correct": "<p><span>Eureka Job!</span> You must be very observant!</p>",
            "incorrect": "<p><span>ERRRR!</span> What planet Earth are <em>you</em> living on?!?</p>"
    ]
}

下面是我如何使用PHP生成的。

function generateJSON($pdo){
     $response = array();
            $response["error"] = false;         
            $response["questions"] = array();
  $stmt = $pdo->prepare("SELECT * FROM questions");
  $stmt->execute();
  $result= $stmt->fetchAll();
  if($stmt->rowCount() > 0){
  foreach($result as $row) {
       $tmp = array();
       $tmp["id"] = $row["id"];
       $tmp["q"] = $row["question"];
       $tmp["correct"] = $row["question"];
       $tmp["incorrect"] = $row["subject_id"];
       $tmp["status"] = $row["level_id"];
       //Fetching the options
       $stmt2 = $pdo->prepare("SELECT * FROM question_options WHERE question_id = ".$tmp["id"]);
       $stmt2->execute();
       $opt_result= $stmt2->fetchAll();
       foreach($opt_result as $opt_row) {
       $option = array();
       $option["option"] = $opt_row["option_text"];
       $option["correct"] = $opt_row["is_correct"] ==1;
       array_push($response["questions"], $option);
       }
       //End of fetching options for this question
       array_push($response["questions"], $tmp);
  }
  }
            echoRespnse(200, $response);
}

正如@apokryfos在评论中提到的,您确实应该考虑使您的代码更加模块化。最常见的,也可以说是最简单的方法是使用类。
一个快速的例子,告诉你如何构建它:

class Quiz {
    private $questions;
    public function addQuestion (Question $question)
    public function addGrade ($title, $score)
    public function serialize ()
}
class Question {
    private $text;
    private $alternatives = array ();
    private $correctString;
    private $incorrectString;
    public function setText ($text)
    public function addAlternative ($text, $correct)
    public function serialize ()
}

根据需要填写,并添加您需要的几个缺少的方法。确保在serialize()函数中返回必要的数据,以便可以使用它们来构建所请求的数组。

一旦完成,那么您可以做类似的事情,使用INNER JOIN在一个查询中获取所有记录:

// Generate the quiz and set all of its properties.
$quiz = new Quiz ();
while ($row = $res->fetch_row ()) {
    if ($row['question_id'] != $oldID) {
        // Save the old (completed) question to the quiz.
        $quiz->addQuestion ($question);
        // Used to detect when we get to a new question.
        $oldID = $row['question_id'];
        $question = new Question ();
        // Add the question details here.
        $question->addTitle ();
        ......
    }
    // Each question has at least one alternative.
    $question->addAlternative ($row['alt'], $row['correct']};
}
// We need to ensure that we've added the last question to the quiz as well.
$quiz->addQuestion ($question);
$data = json_serialize ($quiz->serialize ());