Как я могу перетасовать несколько данных JSON в foreach? (PHP) - PullRequest
0 голосов
/ 31 мая 2019

Это не та же логика, что и у других вопросов.


Есть два JSON-данных. Я хочу убедиться, что ответы на вопрос написаны в сложной форме. Но я не мог этого сделать. Я могу получить один JSON, когда могу, но я получаю ошибку, когда существует более одного JSON
  • Вопросы: Общее количество людей в мире?

  • Опции: {'opt1':'4 Billion','opt2':'5 Billion','opt3':'6 Billion','opt4':'7 Billion'}

  • Ответ: {"0":"2","1":"3"} // правильные ответы: 2. и 3. варианты (Несколько)

код

   $options = json_decode($quiz->options); 
   $answers = json_decode($quiz->answerOfQuestion, true);

   foreach ($options as $key => $firstvalue) {
        if (in_array(substr($key, -1), $answers)) {
        // correct options
            echo "<input type='checkbox' value='".substr($key, -1)."'>";
        } else { 
        // wrong options
            echo "<input type='checkbox' value='".substr($key, -1)."'>";
        }
    }

Что я наделал?

   $options = shuffle(json_decode($quiz->options)); 
   $answers = shuffle(json_decode($quiz->answerOfQuestion, true));

Ошибка:

Unknown error type: [8] Only variables should be passed by reference
Unknown error type: [2] shuffle() expects parameter 1 to be array, object given
Unknown error type: [8] Only variables should be passed by reference
Unknown error type: [2] Invalid argument supplied for foreach()

Как мне сделать сложную запись shuffle?

1 Ответ

1 голос
/ 31 мая 2019

Сообщения об ошибках довольно очевидны. Вы не можете передать значение в shuffle, только в переменную. Во-вторых, shuffle принимает массив, а не объект, поэтому, когда вы json_decode($options), вам нужно передать true в качестве второго параметра, чтобы он возвращал массив. Обратите внимание, что поскольку ваш $options является ассоциативным массивом, shuffle не будет работать для вас, поскольку он переиндексирует массив с помощью цифровых клавиш. Вместо этого вы можете использовать uasort, чтобы перетасовать его:

$answers = '{"0":"2","1":"3"}';
$answers = json_decode($answers, true);
$options = '{"opt1":"4 Billion","opt2":"5 Billion","opt3":"6 Billion","opt4":"7 Billion"}';
$options = json_decode($options, true);
uasort($options, function ($a, $b) {
    return rand(-1, 1);
});
foreach ($options as $key => $value) {
    echo $value;
    if (in_array(substr($key, -1), $answers)) {
    // correct options
        echo "<input type='checkbox' value='".substr($key, -1)."'>" . PHP_EOL;
    } else { 
    // wrong options
        echo "<input type='checkbox' value='".substr($key, -1)."'>" . PHP_EOL;
    }
}

Вывод (случайный):

4 Billion<input type='checkbox' value='1'> 
5 Billion<input type='checkbox' value='2'>
7 Billion<input type='checkbox' value='4'> 
6 Billion<input type='checkbox' value='3'>

Демонстрация по dbfiddle

...