Сначала посмотрите мой пример вывода json.
У меня следующий вопрос. У меня есть несколько полей в коде json, например counter_87 или coutner_88 в части countersData. Это переменная. Мне нужно получить доступ к этому полю класса переменной.
Конечно, я могу написать:
foreach($objCounter->countersData as $data)
{
print $data->counter_87;
}
Работает нормально. Но...
У меня есть идентификатор счетчика, и мне нужно получить доступ к полям, названия которых зависят от этого идентификатора.
Полный код, который покажет, что я хочу:
foreach($objCounter->countersData as $data)
{
$row = "<td width=100px>$data->month $data->year</td>";
foreach($objCounter->counters as $counter)
{
$counterId = $counter->id;
$counterValue = "$data->counter_$counterId";
$row .= "<td>$counterValue</td>";
}
$table .= "<tr>$row</tr>";
}
Мне нужно то же самое:
$foo = 'bar';
$bar = 'foobar';
echo $$foo; // foobar will be printed
Но с классами.
Спасибо.
1 ответ
Вы также можете сделать следующее, если не хотите или не можете изменять структуру JSON, как уже упоминалось в комментариях.
$field_name = 'counter_'.$id;
$field_value = $data->$field_name;
$row .= "<td>$field_value</td>";
// or $row .= '<td>'.$data->$field_name.'</td>';
О переписывании JSON. Вот код, который преобразует ваш JSON в немного лучшую структуру.
$data = json_decode($data_json);
foreach($data->countersData as $counter_data) {
$counters = array();
foreach($counter_data as $key => $val) {
if(substr($key, 0, 8) == 'counter_') {
$counters[substr($key, 8)] = $val;
unset($counter_data->$key);
}
}
$counter_data->counters = $counters;
}
$data_json_new = json_encode($data);
Использование массива вместо полей типа counter_1, counter_2 означает такую структуру:
$countersData[0]->counters[90] = 1;
$countersData[0]->counters[89] = 1;
$countersData[0]->counters[88] = 1;
Вместо того
$countersData[0]->counters_90 = 1;
$countersData[0]->counters_89 = 1;
$countersData[0]->counters_88 = 1;
Это означает наличие ассоциативного массива, называемого счетчиками, вместо отдельных полей, таких как counter_90 или что-то в этом роде. Это значительно упрощает программный доступ к данным.
Обратите внимание, что ассоциативный массив очень похож на stdClass. По сути, другой тип данных, служащий той же цели. Использование массива для представления ваших данных упрощает работу с целочисленными ключами. Вы можете использовать json_decode ($ data_json, true), чтобы получить данные, возвращаемые в виде ассоциативного массива.
Object of class stdClass could not be converted to string (44 line)
. 42–44 строки: $counterId = $counter->id; $field_name = 'counter_'.$counterId;$row .= "<td>$data->$field_name</td>";
Похожие вопросы
Связанные вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.
counter_87
иcounter_88
, вам, вероятно, следует использовать массив вместо отдельных свойств.$data->counter_88
это будет$data->counter[88]
. Затем вы можете сделать$data->counter[$counterId]
,foreach ($data->counter as $c)
и т. Д.