Я действительно застреваю, пытаясь решить, что должно быть довольно просто.
У меня есть это
<?php $json = json_decode('{ "33540116": {"person": {"name":"John", "age":"36"}}, "33541502": {"person": {"name":"Jack", "age":"23"}} } '); $id = array('33540116', '33541502'); foreach($id as $id) { echo $json->$id->person->{'name'}. '<br />'; echo $json->$id->person->{'age'}. '<br />'; } ?>
Таким образом, код декодирует строку json, а затем использует foreach для эхо каждого результата.
Этот json-файл довольно большой, и меня интересуют только определенные записи, которые соответствуют идентификатору, хранящемуся в таблице mysql.
Для этого я заменил строку массива id выше инструкцией select mysql.
<?php $json = json_decode('{ "33540116": {"person": {"name":"John", "age":"36"}}, "33541502": {"person": {"name":"Jack", "age":"23"}} } '); $result = mysql_query("SELECT id FROM people"); $row = mysql_fetch_array($result); $id = array($row['id']); foreach($id as $id) { echo $json->$id->person->{'name'}. '<br />'; echo $json->$id->person->{'age'}. '<br />'; } ?>
Хотя это работает, это дает мне только 1 результат. То, что мне действительно нужно, – это просмотреть результаты. К сожалению, я не знаю, как построить цикл while вместе с foreach.
Я буду очень признателен за вашу помощь.
ОБНОВЛЕНИЕ (дополнительный вопрос)
Всем спасибо. Вы помогли мне решить проблему.
Однако у меня есть еще один вопрос, который касается этого вопроса.
Я упомянул выше, что я просто хотел повторить результаты. Но это не совсем так. Я действительно хочу обновить ту же таблицу mysql с результатами, полученными из файла json.
У меня есть таблица, называемая людьми с именами полей, именем и возрастом.
Как я могу обновить эту таблицу этими результатами?
Еще раз спасибо.
mysql_fetch_array
извлекает только одну строку за раз. Вы можете использовать цикл while, чтобы продолжить выборку строк. Функция mysql_fetch_array
возвращает false
только весь набор результатов был извлечен, так что цикл while будет завершен по желанию.
Кроме того, я удалил цикл foreach
на $ids
. Поскольку в массиве будет только один элемент, нет необходимости вставлять код в цикл.
<?php $json = json_decode('{ "33540116": {"person": {"name":"John", "age":"36"}}, "33541502": {"person": {"name":"Jack", "age":"23"}} } '); $result = mysql_query("SELECT id FROM people"); while ( ( $row = mysql_fetch_array($result) ) ) { $id = $row['id']; echo $json->$id->person->{'name'}. '<br />'; echo $json->$id->person->{'age'}. '<br />'; } ?>
Попробуй это:
while($row = mysql_fetch_array($result)) { $id = array($row['id']); foreach($id as $id) { echo $json->$id->person->{'name'}. '<br />'; echo $json->$id->person->{'age'}. '<br />'; } }
Вы используете это:
$row = mysql_fetch_array($result);
Это приведет к извлечению только одной строки из базы данных.
Если вы хотите получить более одной строки, вы должны вызвать mysql_fetch_array()
в цикле:
while ($row = mysql_fetch_array($result)) { // Work with the current row }
В вашем случае у вас будет что-то вроде этого:
while ($row = mysql_fetch_array($result)) { $id = $row['id']; echo $json->$id->person->{'name'}. '<br />'; echo $json->$id->person->{'age'}. '<br />'; }
Вам не нужен цикл foreach, пока достаточно
$result = mysql_query("SELECT id FROM people"); $id = array($row['id']); while($row = mysql_fetch_array($result)) { echo $json->$row['id']->person->{'name'}. '<br />'; echo $json->$row['id']->person->{'age'}. '<br />'; }
У вас есть пара вопросов. Во-первых, вы не должны использовать foreach ($ id как $ id), так как вы используете одну и ту же переменную для обоих. Вместо этого он должен быть foreach ($ ids как $ id). Во-вторых, вы можете получить список идентификаторов и вывести правильные значения json следующим образом
<?php $json = json_decode('{ "33540116": {"person": {"name":"John", "age":"36"}}, "33541502": {"person": {"name":"Jack", "age":"23"}} } '); $result = mysql_query("SELECT id FROM people"); $ids = array(); while($row = mysql_fetch_array($result)) { $ids[] = $row['id']; } foreach($ids as $id) { echo $json->$id->person->{'name'}. '<br />'; echo $json->$id->person->{'age'}. '<br />'; } ?>
Надеюсь, что это решит