Массивы оперирования - PullRequest
       3

Массивы оперирования

0 голосов
/ 14 апреля 2011

Как переместиться, чтобы подогнать ответы на вопросы в массиве или как сделать sql запрос для желаемого эффекта?Я устал от этого уже несколько дней.

<code><?php
    public function getQuestions()
    {
        $sql = 'SELECT * FROM questions';
        $result = Database::query($sql);
        while ($row = mysql_fetch_assoc($result)) {
            $questions[] = $row;
        }
        return $questions;
    }

    public function getAnswers($qid)
    {
        $sql = 'SELECT idq, answer, truth FROM answers WHERE idq = '.$qid;
        $result = Database::query($sql);
        while ($row = mysql_fetch_assoc($result)) 
        {
            $answers[] = $row;
        }   
        return $answers;
    }

    public static function array_add($a1, $a2) 
    {
        $aRes = $a1;
        foreach (array_slice(func_get_args(), 1) as $aRay) 
        {
            foreach (array_intersect_key($aRay, $aRes) as $key => $val) $aRes[$key] += $val;
            $aRes += $aRay;
        }
        return $aRes; 
    }


    public static function getQuiz()
    {
        $db = new Database();
        self::$questions = $db->getQuestions();
        foreach( self::$questions as $q )
        {
            $qid = $q['qid'];

            self::$answers[$qid] = $db->getAnswers($qid);
        }

        $s = Quiz::array_add(self::$questions, self::$answers);
        print "<pre>";
        print_r($s);
        print "
";}?>

output:

Array
(
    [0] => Array
        (
            [qid] => 1
            [question] => Bunty szlachty pod has?ami obrony praw nazywamy?
        )

    [1] => Array
        (
            [qid] => 2
            [question] => Kto dowodzi? wojskami kozackimi podczas powstania Chmielnickiego?
            [0] => Array
                (
                    [idq] => 1
                    [answer] => liberum veto
                    [truth] => 1
                )

            [1] => Array
                (
                    [idq] => 1
                    [answer] => jurydyki
                    [truth] => 0
                )

            [2] => Array
                (
                    [idq] => 1
                    [answer] => rokosze
                    [truth] => 0
                )

        )

    [2] => Array
        (
            [qid] => 3
            [question] => W którym roku odby?a si?, morska, bitwa pod Oliw??
            [0] => Array
                (
                    [idq] => 2
                    [answer] => Bohdan Chmielnicki
                    [truth] => 1
                )

            [1] => Array
                (
                    [idq] => 2
                    [answer] => Gustaw II Adolf
                    [truth] => 0
                )

            [2] => Array
                (
                    [idq] => 2
                    [answer] => Iwan IV Gro?ny
                    [truth] => 0
                )

        )

    [3] => Array
        (
            [0] => Array
                (
                    [idq] => 3
                    [answer] => 1627
                    [truth] => 1
                )

            [1] => Array
                (
                    [idq] => 3
                    [answer] => 1608
                    [truth] => 0
                )

            [2] => Array
                (
                    [idq] => 3
                    [answer] => 1654
                    [truth] => 0
                )

        )

)

Я пробовал это решение, но мне нужно иметьответы отдельно:

function get_quiz()
{
    $sql = 'SELECT question, GROUP_CONCAT(answer ORDER BY answer SEPARAtoR " ") as answers
            FROM questions 
            LEFT JOIN answers ON (questions.qid=answers.idq) 
            GROUP BY answers.idq;';
    $result = mysql_query($sql);
    while ($row = mysql_fetch_assoc($result)) 
    {
        $quiz[] = $row;
    }   
    return $quiz;
}

вывод:

Array
(
    [0] => Array
        (
            [question] => Bunty szlachty pod has?ami obrony praw nazywamy?
            [answers] => jurydyki liberum veto rokosze
        )

    [1] => Array
        (
            [question] => Kto dowodzi? wojskami kozackimi podczas powstania Chmielnickiego?
            [answers] => Bohdan Chmielnicki Gustaw II Adolf Iwan IV Gro?ny
        )

    [2] => Array
        (
            [question] => W którym roku odby?a si?, morska, bitwa pod Oliw??
            [answers] => 1608 1627 1654
        )

)

1 Ответ

3 голосов
/ 14 апреля 2011

Проблема в этой строке:

        self::$answers[$qid] = $db->getAnswers($qid);

Вопрос с идентификатором "1" помещается в 0-ю позицию массива, поэтому все ответы заканчиваются на 1.

Одним из возможных исправлений является изменение:

    foreach( self::$questions as $q )
    {
        $qid = $q['qid'];
        self::$answers[$qid] = $db->getAnswers($qid);
    }

на:

    foreach( self::$questions as $idx=>$q )
    {
        $qid = $q['qid'];
        self::$answers[$idx] = $db->getAnswers($qid);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...