У меня есть сайт, который я использовал 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
. Мне бы хотелось учиться.
Вам не нужен внутренний цикл. Каждый объект - это всего лишь один объект, а не массив. И предметный ключ - это просто $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']}
";
}
Вы можете использовать второй аргумент для 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>";
}
}
Это приведет к тому же результату, что и предыдущий пример, без необходимости знать имя субъекта!
{"english":{"grade":"7","time":"79"},"physics":{"grade":"3","time":"48"}}
как мне поступить отсюда, а не с той, которую вы указали в ответе в качестве переменной.
Undefined index: grade