2016-09-19 4 views
1

Ich schreibe ein PHP-Skript, das mir eine JSON-Datei im folgenden Format zurückgeben kann. Ich möchte diese Struktur erstellen, indem ich Daten aus meinen Datenbanktabellen abrufe. Ich verwende SlickQuiz Plugin und habe eine harte Zeit, um ein Array von Objekten (d. H. Optionen) innerhalb des Frageobjekts zu erstellen ... das wiederum als Array enthalten ist.Zurückgeben der komplexen JSON-Struktur in PHP

{ 
    "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>" 
    ] 
} 

So habe ich versucht, dies mit PHP zu generieren.

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); 
} 
+0

Ich bin etwas neu, dies zu ... und sicher nicht, ob ich Sie müssen eine ähnliche PHP-Klasse erstellen und diese dann als json codieren. Aber jedes Beispiel oder Vorschlag wird sehr geschätzt. –

+0

Das Erstellen eines Satzes von Klassen, die die 'JsonSerializable'-Schnittstelle implementieren und' json_encode' für das komplexe Objekt verwenden, ist der objektorientierte Ansatz dafür, ist aber optional. Ein assoziatives Array zu erstellen, das alle benötigten Informationen kapselt, ist wahrscheinlich einfacher. – apokryfos

Antwort

0

Wie @apokryfos im Kommentar erwähnt, sollten Sie wirklich zu machen, Ihren Code modular suchen. Der häufigste und wohl einfachste Weg, dies zu tun, ist die Verwendung von Klassen.
Ein schnelles Beispiel dafür, wie man diese Struktur könnte:

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() 
} 

Füllen Sie dieses aus wie nötig, und fügen Sie die wenigen fehlenden Methoden, die Sie benötigen. Stellen Sie sicher, dass Sie die erforderlichen Daten in den serialize() - Funktionen zurückgeben, damit Sie sie zum Erstellen des angeforderten Arrays verwenden können.

Sobald dies geschehen ist, dann kann man etwas Ähnliches wie dies tun, INNER JOIN mit allen Datensätzen in einer Abfrage zu erhalten:

// 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());