php if предложение внутри foreach не получает данные правильно - PullRequest
0 голосов
/ 19 апреля 2010

Вот моя проблема: в моем контроллере я хочу получить пользовательский ввод из формы. Затем я анализирую входные данные и сравниваю их со значениями в базе данных, чтобы убедиться в правильности ввода. Я просто хочу сопоставить ответы пользователя на вопрос, получить идентификатор пользователя, идентификатор вопроса, а затем определить, относится ли ответ к вопросу с несколькими вариантами ответов или флажком, или к чему-то еще. Я беру эти значения и вставляю их в таблицу ответов. Проигнорируйте вещи отказа. Я проверю это, как только получу правильные ответы.

    // add answers and waiver consent records
    try {

        $answerArray = array();
        $waiverArray = array();

    // retrieve answers, waiver consents, and the question ID's from form object
    foreach ($formData as $key => $value) {

        $parts = explode("_", $key);

        if ($parts[0] == 'question') {                                                      
            array_push($answerArray, $value);           
        }

        if ($parts[0] == 'waiverTitle') {                                                       
            array_push($waiverArray, $value);                           
        }
    }

    $questions = new Model_DbTable_Questions();
    $questionResults = $questions->getQuestionResults($session->idEvent);                                   

    foreach ( $questionResults as $qr ) {
        if ($qr ['questionType'] == 'multipleChoice' || $qr ['questionType'] == 'checkBox') {
            foreach ( $answerArray as $aa ) {
                $answerData = $answers->addAnswer ( $lastUserID, $qr ['idQuestion'], null, $aa );
echo count ( $answerData ) . ', ' . $qr ['questionType'] . ', ' . $aa . '<br />';
            }
        } else {
            foreach ( $answerArray as $aa ) {
                $answerData = $answers->addAnswer ( $lastUserID, $qr ['idQuestion'], $aa, null );
echo count ( $answerData ) . ', ' . $qr ['questionType'] . ', ' . $aa . '<br />';
            }
        }
    }

    } 

    catch (Zend_Db_Statement_Exception $e) 
    { 

        $e->getMessage();
        throw $e;
    }

Исходя из моих тестовых данных, я ожидаю получить 2 записи, которые соответствуют критериям множественного выбора и флажков, и 1 запись для текста в предложении ELSE, например:

3, checkbox, 1
3, multipleChoice, 1
3, text, question_2

То, что я получаю, является декартовым произведением 3х3, каждый из 3 элементов вопроса с 3 возможными ответами, подобными этим выводам из эхо-операторов:

4, checkBox, 1
4, checkBox, 1
4, checkBox, question_2
4, multipleChoice, 1
4, multipleChoice, 1
4, multipleChoice, question_2
4, text, 1
4, text, 1
4, text, question_2

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

Ответы [ 2 ]

0 голосов
/ 20 апреля 2010

После долгих анализов мозга я наконец получил его (конечно, при большой помощи со стороны моего коллеги и коллеги). Большое спасибо за вашу помощь. Виртуальное пиво для всех!

$answerData = array();

$questions = new Model_DbTable_Questions();
$questionResults = $questions->getQuestionResults($session->idEvent);                                   

// retrieve answers, waiver consents, and the question ID's from form object
    foreach ($formData as $key => $value) 
    {
        $parts = explode("_", $key);
        if($parts[0] == 'question')
        {                           
            foreach ($questionResults as $question) 
            {

                if ($parts[1] == $question['idQuestion']) 
                {                   
                    if (in_array($question['questionType'], array('multipleChoice','checkBox') )) 
                    {   
                        $answerData = $answers->addAnswer ( $lastUserID, $question['idQuestion'], null, $value );
                    }
                    else 
                    {
                        $answerData = $answers->addAnswer ( $lastUserID, $question['idQuestion'], $value, null );
                    }
                }

            }
        }
    }
0 голосов
/ 19 апреля 2010

Я не очень понимаю:

  1. Почему вы думали, что вы получите 3 строки, поскольку у вас есть вложенный цикл, который повторяет каждый ответ на каждый вопрос ...
  2. Почему вы подумали, что предложение try-catch поможет нам ответить на ваш вопрос.

Но я упростил ваш код, так что кто-то может ответить на вопрос:

<?php
$answerArray = array();
$waiverArray = array();

// retrieve answers, waiver consents, and the question ID's from form object
foreach ($formData as $key => $value) {

    $parts = explode("_", $key);

    if ($parts[0] == 'question') {                                                      
        array_push($answerArray, $value);           
    }

    if ($parts[0] == 'waiverTitle') {                                                       
        array_push($waiverArray, $value);                           
    }
}

$questions = new Model_DbTable_Questions();
$questionResults = $questions->getQuestionResults($session->idEvent);                                   

foreach ( $questionResults as $qr ) {
    foreach ( $answerArray as $aa ) {
        if (in_array($qr['questionType'], array('multipleChoice','checkBox') )) {
            $answerData = $answers->addAnswer ( $lastUserID, $qr ['idQuestion'], null, $aa );
        } else {
            $answerData = $answers->addAnswer ( $lastUserID, $qr ['idQuestion'], $aa, null );
        }
        echo count ( $answerData ) . ', ' . $qr ['questionType'] . ', ' . $aa . '<br />';
    }
}

?>
...