Здравствуйте, я пытаюсь распечатать файл json в таблице. Файл json взят с этого сайта https://jsonvat.com/. Я хочу распечатать $data->rates->periods->rates[0]->standard. Но я получаю
"Cannot use object of type stdClass as array in ..."
Мой код таков:
$data = json_decode($response);
echo '<table class = "table"><thead><tr><th scope = "col">Country</th><th scope = "col">First</th><th scope = "col">Last</th><th scope = "col">Handle</th></tr></thead><tbody>';
foreach($data->rates as $rate){
echo '<tr><th scope = "row">'.$rate->name.'</th>';
foreach($rate->periods as $period){
echo '<td>'.$period->rates->standard.'</td><td>'.$period->rates->redused.'</td><td>'.$period->rates->super_reduced.'</td></tr>';
}
}
echo '</tbody></table>';
Когда я меняю $data = json_decode($response); на $data = json_decode($response, true); и код становится
foreach($data as $rate){
echo '<tr><th scope = "row">'.$rate['name'].'</th>';
я получаю сообщение об ошибке
Warning: Illegal string offset 'name' in C:\xampp\htdocs\wordpress\wp-content\plugins\test-plug\functions.php on line 23.
Заранее спасибо.
Кажется, это ничего не печатает, когда я делаю эхо.
О, хорошо, моя ошибка. Как я могу сделать это в foreach?
Вы просто хотите распечатать все стандартные ставки из файла?
Я хочу также уменьшенный и супер_уменьшенный.






$tarray = json_decode($sjson);
$newarray = array('sample'=>array());
foreach($tarray->name as $ix => $name) {
$newarray['catalog'][]=array(
'name' => $tarray->name[$ix],
'image' => $tarray->image[$ix],
'price' => $tarray->price[$ix],
);
}
$sjson = json_encode($newarray);
или вы можете использовать .split()
Спасибо за ваш ответ. Моя проблема в том, что это не просто имя, я хочу напечатать весь json сразу, а только первый объект
Можете ли вы показать мне пример вашего json и требуемого ответа
Ссылка json находится в исходном сообщении. Я хочу напечатать название страны и только текущие ставки.
Вам нужно изменить свой код, как показано ниже:
$json = file_get_contents("https://jsonvat.com/");
$dataObject = json_decode($json, true);
echo '<table class = "table"><thead><tr><th scope = "col">Country</th><th scope = "col">First</th><th scope = "col">Last</th><th scope = "col">Handle</th></tr></thead><tbody>';
foreach($dataObject['rates'] as $rate){
echo '<tr><th scope = "row">'.$rate['name'].'</th>';
foreach($rate['periods'] as $period){
echo '<td>'.$period['rates']['standard'].'</td><td>'.$period['rates']['reduced'].'</td><td>'.$period['rates']['super_reduced'].'</td></tr>';
}
}
echo '</tbody></table>';
Здесь я обнаружил, что иногда в ключе Rate не существует уменьшенного или super_reduced ключа. поэтому вам нужно внести соответствующие изменения в код. Надеюсь, это поможет вам.
Спасибо за ваш ответ. Это работает, но не ограничено объектом [0]
Я не понял вашей точки зрения, что это не объект limite din [0]? Вы можете объяснить это немного?
Не бери в голову. Ваш код очень помог мне решить мою проблему. Спасибо.
У вас есть несколько проблем с различными элементами, к которым вы пытаетесь получить доступ (включая опечатки). Не все элементы имеют уменьшенное (не «уменьшенное») значение, некоторые имеют уменьшенное1 (и уменьшенное2) значение или вообще не имеют значения, то же самое с super_reduced. В коде я использовал нулевое объединение (??), чтобы установить значение по умолчанию, если значение не найдено. Вы можете настроить их, чтобы показать что-то, что, по вашему мнению, лучше всего не показывать...
echo '<td>'.$period->rates->standard.'</td><td>'.
($period->rates->reduced??$period->rates->reduced1??'Non').
'</td><td>'.($period->rates->super_reduced??'Non').'</td></tr>';
Вы можете получить доступ к значениям с помощью простого цикла foreach() и установить, как хотите, для своего элемента <tr>.
$array = json_decode($json,1);
foreach($array['rates'] as $k=>$v){
echo $v['periods'][0]['rates']['standard'].PHP_EOL;
}
Вы неправильно поняли второй параметр json_decode: документ говорит:
When TRUE, returned objects will be converted into associative arrays.
Итак, если раньше вы должны были получать доступ к ставкам с помощью $data->rates, теперь вы должны использовать $data['rates'] (то же самое для $rate->periods, которое становится $rate['periods']).
Таким образом, вы могли бы выглядеть (непроверено)
foreach($data['rates'] as $rate) {
echo '<tr><th scope = "row">'.$rate['name'].'</th>';
}
Когда вы декодируете как объект, вложение равно $data->rates[0]->periods[0]->rates->standard, где первые rates и periods являются массивами. Просто зациклите их обоих:
foreach($data->rates as $rates) {
foreach($rates->periods as $period) {
echo $period->rates->standard . "<br />\n";
echo $period->rates->reduced. "<br />\n";
echo $period->rates->super_reduced . "<br />\n";
}
}
Если существование определенных свойств не гарантируется, проверьте с помощью isset.
попробуйте это может вам помочь, или вы можете использовать это на функции
<?php
$count = 0;
$limit = 50;
foreach($data['rates'] as $rate) {
//count times export data
$count++;//first = 0
if ($count == $limit)
break;//if limit == count stop
//export data
echo $rate['name'];
}
?>
Он вложен так
$data->rates[0]->periods[0]->rates->standard, где первыйratesимеет несколько объектов.