2014-11-12 3 views
0

Недавно у меня появилось некоторое представление о преобразовании результатов запроса mysql в json для системы викторины. Результаты запроса содержат множество вопросов и связанных с ними вопросов. Выполненная процедура направлена ​​на то, чтобы поставить эти вопросы и ответы в многомерный массив, а затем преобразовать его в json для построения викторины db. Я готов использовать JS-процедуру (модуль викторины), которая работает с ниже упомянутой структурой JSON. Но строить эту структуру, я застрял с помощью следующей процедуры PHP:Многомерный массив для структуры 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; 

Ожидаемое Вывод в формате 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 
.... 

Надеюсь, что это объяснит идею желаемой ударной конструкции, упомянутой выше.

ответ

0

Вы можете попытаться использовать команду php json_encode. (ссылка на php.net ->http://php.net/manual/it/function.json-encode.php)

Ссылка показывает пример структуры массива. На php.net говорится, что он работает с каждым типом структуры (а не с ресурсами).

Редактировать: как я вижу, вы уже используете эту команду, но каков фактический вывод? Сколько отличается от вашего желаемого?

+0

спасибо за ваш ответ, но мне нужно поместить результат запроса в многомерный массив «правильно» (while loop), чтобы получить вышеупомянутую структуру json. – Dozent

+0

результат различается в массивах ответов, а именно только первый вариант печати и первый правильный ключ печатает. Посмотрите в ** ОБНОВЛЕНО ** раздел моего вопроса. I pt некоторые уточнения – Dozent

0

Добавить один счетчик $ 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++; 
     } 

это будет работать

+0

Имейте в виду ** ОБНОВЛЕНО ** часть вопроса пожалуйста. – Dozent

1

Я думаю, что это даст результат, который вы хотите.

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

В коде, вы перезаписать один элемент этого массива вместо добавления на другие вопросы

+0

Глядя на json-я думаю, вы должны добавить объект, а не массив. – iLot

+0

В вашем решении он печатает только первый ответ, но для данного вопроса есть более одного ответа. Кроме того, «правильный» ключ должен совпадать с правильной «answer_key» в наборе ответов. Посмотрите обновленную часть вопроса. – Dozent

0

Я считаю, что это будет решать это для вас (я использовал массив для тестирования, я надеюсь, Я правильно понял вопрос).

Вам нужно будет изменить цикл 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 
    }] 
} 

Я хочу извиниться за наименование соглашения здесь и несколько грубое отношение, данное этим кодом, но здесь очень поздно;

Смежные вопросы