Задать вопрос
@verest14

Как обратиться к свойству объекта не зная его имени?

Здравствуйте, с бд поступает такой json. Проблема в том, что названия phone_lg, phone_samsung будут всегда разные - как к ним обращаться в цикле, не зная их.

[{
	"id_predmet": "24",
	"json_param": {
		"phone_lg": {
			"price": "200",
			"old_price": "300"
		}
	}
}, {
	"id_predmet": "25",
	"json_param": {
		"phone_samsung": {
			"price": "400",
			"old_price": "500"
		}
	}
}]


$predmet = json_decode(JSON_ЧТО_ВЫШЕ); //берем данные c БД

foreach($predmet as $inv_field => $inv_val) {
echo $inv_val->json_param->phone_samsung->price;
}

Если выводить напрямую ($inv_val->json_param->phone_samsung->price) - все работает. Но мне неизвестны названия свойств phone_lg, phone_samsung и т.п. Как вывести данные из объекта, если не известны названия их свойств?

Поставил внутри foreach второй цикл - название выводит и я смогу его использовать,

foreach($inv_val->json_param as $inv_field2 => $inv_val2) {
echo $inv_field2;
}

но должен быть более простой способ типа: $inv_val->json_param->не_известно->price. Подскажите, пожалуйста
  • Вопрос задан
  • 373 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@DanKud
Можно например собрать неизвестные ключи в отдельный массив и потом взять из него эти значения:
$predmet = json_decode($json, true);

$keys = array_map(function ($n) {
    return array_keys($n['json_param'])[0];
}, $predmet);

$i = 0;
foreach ($predmet as $inv_val) {
    echo $inv_val['json_param'][$keys[$i]]['price'];
    $i++;
}
Ответ написан
Комментировать
GomelHawk
@GomelHawk
PHP / Symfony developer
Можно сделать так:

foreach($predmet as $inv_field => $inv_val) {
    $price = current((array) $inv_val->json_param)->price;
}


Но это реально костыль. Как минимум правильнее будет унифицировать ключи и тип телефона сохранять в другом поле вместо ключа.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы