Сначала посмотрите мой пример вывода 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

Но с классами.

Спасибо.

0
Sharikov Vladislav 15 Мар 2014 в 06:08
2
Если у вас есть такие свойства, как counter_87 и counter_88, вам, вероятно, следует использовать массив вместо отдельных свойств.
 – 
Barmar
15 Мар 2014 в 06:15
Почему вы декодируете объект?
 – 
Scony
15 Мар 2014 в 06:15
 – 
Barmar
15 Мар 2014 в 06:16
Что ты имеешь ввиду (про массивы)? Пример пожалуйста.
 – 
Sharikov Vladislav
15 Мар 2014 в 06:17
Если у вас есть переменные или свойства с пронумерованными суффиксами, лучше собрать их в массив. Так что вместо $data->counter_88 это будет $data->counter[88]. Затем вы можете сделать $data->counter[$counterId], foreach ($data->counter as $c) и т. Д.
 – 
Barmar
15 Мар 2014 в 06:23

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), чтобы получить данные, возвращаемые в виде ассоциативного массива.

1
Ivarpoiss 15 Мар 2014 в 07:00
Это сделано атм. Появляется эта ошибка: 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>";
 – 
Sharikov Vladislav
15 Мар 2014 в 06:23
Это потому, что вы не можете преобразовать $ data -> $ field_name в строку в двойных кавычках в php. Я обновлю свой ответ.
 – 
Ivarpoiss
15 Мар 2014 в 06:26
Хороший. Спасибо. Работаю сейчас. Вы ответили на вопрос :)
 – 
Sharikov Vladislav
15 Мар 2014 в 06:29
Хм. Может быть, вы можете объяснить, как использовать массив вместо объекта? Примером :)
 – 
Sharikov Vladislav
15 Мар 2014 в 06:31
Я добавил, что смог.
 – 
Ivarpoiss
15 Мар 2014 в 06:57