Как ограничить foreach в первом объекте файла json

Здравствуйте, я пытаюсь распечатать файл 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.

Заранее спасибо.

Он вложен так $data->rates[0]->periods[0]->rates->standard, где первый rates имеет несколько объектов.

AbraCadaver 22.02.2019 17:49

Кажется, это ничего не печатает, когда я делаю эхо.

Vais 22.02.2019 17:51
3v4l.org/Y3DRh
AbraCadaver 22.02.2019 17:53

О, хорошо, моя ошибка. Как я могу сделать это в foreach?

Vais 22.02.2019 17:55

Вы просто хотите распечатать все стандартные ставки из файла?

AbraCadaver 22.02.2019 17:56

Я хочу также уменьшенный и супер_уменьшенный.

Vais 22.02.2019 17:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
217
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

 $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 сразу, а только первый объект

Vais 22.02.2019 17:49

Можете ли вы показать мне пример вашего json и требуемого ответа

tetar 22.02.2019 17:50

Ссылка json находится в исходном сообщении. Я хочу напечатать название страны и только текущие ставки.

Vais 22.02.2019 17:53
Ответ принят как подходящий

Вам нужно изменить свой код, как показано ниже:

$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]

Vais 22.02.2019 17:59

Я не понял вашей точки зрения, что это не объект limite din [0]? Вы можете объяснить это немного?

Rohit Mittal 22.02.2019 18:08

Не бери в голову. Ваш код очень помог мне решить мою проблему. Спасибо.

Vais 22.02.2019 18:17

У вас есть несколько проблем с различными элементами, к которым вы пытаетесь получить доступ (включая опечатки). Не все элементы имеют уменьшенное (не «уменьшенное») значение, некоторые имеют уменьшенное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;
 }

ДЕМО:https://3v4l.org/O9EjB

Вы неправильно поняли второй параметр 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'];
}
?>

Другие вопросы по теме