Intereting Posts
Локальные жетоны JWT недействительны после обновления их в подходе к проверке подлинности JWT Способы хранения информации для входа в базу данных Планирование системы заказа новостей Предоставляет ли Aptana 3 плагин PHP так же хорошо, как Aptana 1.5.1? Флажок внутри флажка в раскрывающемся списке Как успешно переписать старый код mysql-php с устаревшими функциями mysql_ *? preg_replace все нецифровые символы, кроме + в начале строки обновить значение cookie в php Не удается создать php str_replace (), чтобы удалить запятую javascript и utf-8 / специальные символы Как проверить, есть ли запрос, поступающий с того же сервера или другого сервера? Как я могу получить пользовательский ввод между php-кодом (от клиента к серверу)? DOMXPath получает родного брата в зависимости от предыдущего значения брата PHP Преобразование всех URL-адресов в html-ссылки PDO с запросами «WHERE … IN»

Как получить результаты в виде многомерного массива из mySQL и PHP?

Я только начинаю изучать более сложные SQL вместе с PHP, и я действительно пытаюсь выяснить, как запросить мою базу данных для викторины, которую я создаю.

В конечном счете, я пытаюсь вернуть объект json со следующей структурой, которая дает мне список вопросов и все возможные ответы как многомерный массив:

{ "questions": [ { "question": "question text here", "answers": [ { "answer": "answer text here", "points": 10 }, { "answer": "answer text here", "points": 20 }, { "answer": "answer text here", "points": 30 }, { "answer": "answer text here", "points": 40 } ] }, { "question": "question text here", "answers": [ { "answer": "answer text here", "points": 10 }, { "answer": "answer text here", "points": 20 }, { "answer": "answer text here", "points": 30 }, { "answer": "answer text here", "points": 40 } ] } ] { 

… из моих mySQL-таблиц следующей структуры:

викторина

 id | title 1 | quiz title here 

quiz_question

 id | quiz_id (FK) | question_text 1 | 1 | question text here 2 | 1 | question text here 

quiz_answer

 id | quiz_question_id (FK) | answer_text | points 1 | 1 | answer text here | 10 2 | 1 | answer text here | 20 3 | 1 | answer text here | 30 4 | 1 | answer text here | 40 

… со следующими внешними ключами:

 quiz_question.quiz_id is FK to quiz.id quiz_answer.quiz_question_id is FK to quiz_question.quiz_id 

… используя следующий PHP (в простейшей форме, которая в настоящее время возвращает только мои вопросы):

 //query the db $query = mysql_query(" SELECT quiz_question.question_text FROM quiz_question JOIN quiz ON quiz.id = quiz_question.quiz_id WHERE quiz.id = 1; "); $numrows = mysql_num_rows($query); for ($i = 0; $i < $numrows; $i++) { $row = mysql_fetch_assoc($query); $quiz_data[$i] = array("question" => $row["question_text"]); } //echo JSON to page $response = $_GET["jsoncallback"] . "(" . json_encode($quiz_data) . ")"; echo $response; 

… и используя jQuery's $ .getJSON () в моем JavaScript, который получает мой форматированный JSON-объект из моего PHP, который возвращает мне следующее:

 [ {"question":"question text here"}, {"question":"question text here"} ] 

Поэтому мой вопрос: как я могу написать свой SQL и PHP для создания многомерного массива, такого как выше, вместо одного массива, как я сейчас возвращаюсь? Мне нужно выяснить, как включать вопросы и все связанные ответы в виде многомерного массива.

Вы не можете получить многомерный массив только с mysql (по крайней мере, насколько я знаю). Вам нужно будет выполнить некоторую обработку php. Это не кажется сумасшедшим.

Сначала обновите свой запрос, чтобы выбрать ответы одновременно, присоединив quiz_answers к quiz_questions используя идентификатор вопроса. Затем в вашей петле:

 $quiz = array(); while ($row = mysql_fetch_assoc($result)) { // you don't need to check num_rows // fetch_assoc returns false after the last row, so you can do this // which is cleaner if (!isset($quiz[$row['question_id'])) { $quiz[$row['question_id']] = array( 'question' => $row['question_text'] , 'answers' => array() ); } $quiz[$row['question_id']]['answers'][] = $row['answer_text']; } $full = json_encode(array('questions' => $quiz')); 

Это даст вам массив, который вы хотите после кодирования json.

Обратите внимание, что в конечном итоге вы выберите текст вопроса / идентификатор один раз за каждый ответ, что неэффективно. Вы можете использовать GROUP_CONCAT для ответов, но выше все равно будет работать почти одинаково, вам просто нужно разделить строку ответа.

Я также предлагаю вам использовать PDO или другую оболочку поверх mysql_* .

Насколько мне известно, вам понадобится построить многомерный массив после вытаскивания результатов из базы данных.

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

 $results = array( array( 'question' => 'question 1', 'answer' => 'answer 1', 'points' => 10 ), array( 'question' => 'question 1', 'answer' => 'answer 2', 'points' => 30 ), array( 'question' => 'question 2', 'answer' => 'answer 1', 'points' => 20 ), array( 'question' => 'question 2', 'answer' => 'answer 2', 'points' => 50 ) ); 

Затем оттуда вы можете построить свой массив json, объединив вопросы и ответы вместе.

В принципе, php и стандартные функции mysql_query не будут строить многомерные массивы, поэтому вам придется вытащить данные и собрать их самостоятельно.

Вы просто запускаете свои запросы, а затем создаете на их основе составную структуру данных ( $questions ); Пример:

 $questions= array(); $rowsQuestions = $gateway->findQuestions($quiz); foreach($rowsQuestions as $row) { $questions[$row->id] = new stdClass; $questions[$row->id]->question = $row->question_text; } $rowsAnswers = $gateway->findAnswers($quiz); foreach($rowsAnswers as $row) { $answer = (object) array( 'answer' => $row->answer_text, ... ); $questions[$row->quiz_question_id]->answers[] = $answer; } 

Предыдущие ответы будут иметь большую производительность, чем я предполагаю, но эта статья предлагает гибкое решение для «объединенных» результатов, особенно в том случае, когда вложенные соединения объединяются друг с другом.

Массив преобразования базы данных PHP

Запустите результат через json_encode() чтобы преобразовать его в объект JSON.