如何从mySQL和PHP检索多维数组的结果?

时间:2012-01-09 16:50:24

标签: php jquery mysql select multidimensional-array

我刚刚开始学习更多高级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;

...在我的JavaScript中使用jQuery的$ .getJSON(),它从我的PHP中获取了一个JSON格式的对象,它让我得到以下内容:

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

所以我的问题是,如何编写我的SQL和PHP来创建像上面那样的多维数组而不是像我现在要回来的单个数组?我需要弄清楚如何将问题和所有相关答案都包含在一个多维数组中。

4 个答案:

答案 0 :(得分:5)

你不能完全用mysql检索一个多维数组(至少据我所知)。你将不得不做一些PHP处理。这听起来并不太疯狂。

首先,通过使用问题ID加入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编码后所需的数组。

请注意,您最终会为每个答案选择一次问题文本/ ID,效率很低。你可以在答案上使用GROUP_CONCAT,但上面几乎完全相同,你只需要分开答案字符串。

我还建议您使用PDO或其他一些包装器mysql_*

答案 1 :(得分:1)

据我所知,在从数据库中提取结果后,您需要构建多维数组。

您可以对问题和答案进行联接,因此生成的数组看起来像这样:

$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函数不会构建多维数组,所以你必须自己提取数据并自行构建。

答案 2 :(得分:1)

您只需运行查询,然后根据它创建复合数据结构($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;
}

答案 3 :(得分:0)

以前的答案都会比我要提出的更好的表现,但本文提供了一个灵活的解决方案,以及#34;加入&#34;结果,特别是当嵌套连接相互构建时。

<强> PHP Rebuild Database Result Array

通过json_encode()运行结果,将其转换为JSON对象。