Редактирование плохо отформатированной строки JSON в PHP

1

У меня есть сайт, который я использовал JSON для сохранения некоторых данных.

Вот как он сохраняет данные

{"1":{"english":{"grade":"7","time":"79"},"physics":{"grade":"3","time":"48"}}}

Примечание. Я знаю, что это плохой способ сделать это, но я сделал это, когда я был не таким огромным!

1 является user_id который изменяется в соответствии с идентификатором пользователя, который принимает экзамен на платформе. english, physics - предметы, которые этот пользователь взял.

Максимальное количество экзаменов, которые может принимать пользователь за раз, так что строка json будет выглядеть как {"1":{"english":{"grade":"7","time":"79"},"physics":{"grade":"3","time":"48"},"maths":{"grade":"7","time":"79"},"chemistry":{"grade":"3","time":"48"}}}

Сначала я думаю, что это лучший способ сохранить результат как строку JSON

[{"subject":"english","grade":"7","time":"79"}, {"subject":"physics", "grade":"3","time":"48"}}]

Моя проблема в том, что я хочу использовать PHP для работы над первым. Я сделал несколько зачисток строки, и я остался с этим {"english":{"grade":"7","time":"79"},"physics":{"grade":"3","time":"48"}}

Я пробовал этот кусок

$JSONResult = json_decode($aScore->result);
foreach ($JSONResult as $subjectKey => $aSubject)
{
    foreach ($aSubject as $theResult)
    {
        $userResult = '
        Subject: **This is what I've not been able to get**
        Grade: '.$theResult->grade.'
        Time: '.$theResult->time.'
        ';
    }
}

Я попытался $aSubject->subjectKey получить значение ассоциативного ключа из первого оператора foreach но он не работал

Любая помощь?

Добавлено: Пожалуйста, оставляйте комментарии о том, как была сохранена строка JSON. Мне бы хотелось учиться.

Теги:

2 ответа

2
Лучший ответ

Вам не нужен внутренний цикл. Каждый объект - это всего лишь один объект, а не массив. И предметный ключ - это просто $subjectKey, это не часть объекта.

$JSONResult = json_decode($aScore->result, true); // to get an associative array rather than objects
foreach ($JSONResult as $subjectKey => $aSubject) {
    $userResult = "
        Subject: $subjectKey
        Grade: {$aSubject['grade']}
        Time: {$aSubject['time']}
    ";
}

DEMO

  • 0
    Вот что я получаю, когда убираю внутренний цикл Undefined index: grade
  • 0
    Мой ответ основан на JSON в вопросе после того, как «я остался с этим»
Показать ещё 1 комментарий
0

Вы можете использовать второй аргумент для json_decode!

Он изменяет ваш $JSONResult из stdClass в ассоциативный Array!

Это означает, что вы можете сделать что-то вроде этого:

$str = '{"1":{"english":{"grade":"7","time":"79"},"physics":{"grade":"3","time":"48"}}}';

$result = json_decode($str, true); // Put "true" in here!

echo "<pre>".print_r($result, true)."</pre>"; // Just for debugging!

Что бы вывести это:

Array
(
    [1] => Array
    (
        [english] => Array
        (
            [grade] => 7
            [time] => 79
        )
        [physics] => Array
        (
            [grade] => 3
            [time] => 48
        )
    )
)

И для того, чтобы пройти через него:

foreach ($result as $idx => $exams) {

    echo $exams['english']['grade']."<br>";
    echo $exams['physics']['grade']."<br>";

}

Что бы вывести это:

7
3

Обновить

Не зная данные содержащихся массивов (основываясь на приведенном выше примере)

$exams будет Array (который может содержать любую информацию):

Array
(
    [english] => Array
    (
        [grade] => 7
        [time] => 79
    )
    [physics] => Array
    (
        [grade] => 3
        [time] => 48
    )
)

Если вы хотите пройти через $exams:

foreach ($result as $idx => $exams) {

    foreach ($exams as $subject => $info) {

        echo $info['grade']."<br>";

    }

}

Это приведет к тому же результату, что и предыдущий пример, без необходимости знать имя субъекта!

  • 0
    Это может не соответствовать вашему окончательному чанку, потому что я не знаю, какие предметы экзамена выберет пользователь, поэтому $ val ['english'] ['grade'] должен выглядеть примерно так: $ val [$ subject] ['grade]. Как вы думаете?
  • 0
    Я сказал, что оборвал строку и у меня осталось это {"english":{"grade":"7","time":"79"},"physics":{"grade":"3","time":"48"}} как мне поступить отсюда, а не с той, которую вы указали в ответе в качестве переменной.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню