Проблема с получением объекта из обработанного вывода JSON

#php #arrays #json

#php #массивы #json

Вопрос:

Я играю с API Twitter и пытаюсь проанализировать вывод json. Однако каким-то образом я делаю что-то не так, и я не получаю то, что хотел бы получить.

В этом случае я пишу на PHP. Начал цикл через массив, и screen_name и text работают соответственно.

 foreach ($statuses as $obj) {

  $screen_name  =   filter_var($obj->user->screen_name, FILTER_SANITIZE_STRING);
  $text         =   filter_var($obj->text, FILTER_SANITIZE_STRING);
  $urls         =   filter_var($obj->entities->urls->url, FILTER_SANITIZE_URL);
}
  

вывод массива JSON:

 array (
  0 => 
  stdClass::__set_state(array(
     'created_at' => 'Fri Oct 07 15:31:01  0000 2016',
     'text' => 'test',
     'entities' => 
    stdClass::__set_state(array(
       'hashtags' => 
      array (
        0 => 
        stdClass::__set_state(array(
           'text' => '30Under30',
           'indices' => 
          array (
            0 => 36,
            1 => 46,
          ),
        )),
      ),
       'symbols' => 
      array (
      ),
       'user_mentions' => 
      array (
      ),
       'urls' => 
      array (
        0 => 
        stdClass::__set_state(array(
           'url' => 'https://Forbes.com',
           'expanded_url' => 'https://twitter.com/i/web/status/784415744427687936',
           'display_url' => 'twitter.com/i/web/status/7…',
           'indices' => 
          array (
            0 => 117,
            1 => 140,
          ),
        )),
      ),
    )),
     'source' => 'Sprinklr',
     'in_reply_to_screen_name' => NULL,
     'user' => 
    stdClass::__set_state(array(
       'id' => 91478624,
       'screen_name' => 'test',
       'url' => 'http://Forbes.com',
       'entities' => 
      stdClass::__set_state(array(
         'url' => 
        stdClass::__set_state(array(
           'urls' => 
          array (
            0 => 
            stdClass::__set_state(array(
               'url' => 'http://Forbes.com',
               'expanded_url' => 'http://forbes.com',
               'display_url' => 'forbes.com',
               'indices' => 
              array (
                0 => 0,
                1 => 22,
              ),
            )),
          ),
        )),
         'description' => 
        stdClass::__set_state(array(
           'urls' => 
          array (
            0 => 
            stdClass::__set_state(array(
               'url' => 'http://Forbes.com',
               'expanded_url' => 'http://Forbes.com',
               'display_url' => 'Forbes.com',
               'indices' => 
              array (
                0 => 28,
                1 => 48,
              ),
            )),
          ),
        )),
      )),
       'protected' => false,
       'notifications' => false,
    )),
     'geo' => NULL,
     'lang' => 'en',
  )),
)
  

Комментарии:

1. Было бы неплохо иметь пример того, что вы хотите в качестве результата. Я думаю, просто передайте второй параметр как true json_decode($string, true) . php.net/manual/en/function.json-decode.php

2. Мне нужен первый 'url' => 'https://Forbes.com', параметр. Я думаю, что это примерно в строке 32. Для меня это выглядит как путь entities-> urls-> url. Однако это не работает

3. urls это массив, поэтому вам нужно $obj->entities->urls[0]->url

4. ah работает. Спасибо.

5. Но почему мне не нужно указывать номер массива в части $obj ?

Ответ №1:

Поскольку urls это массив, вам нужно его проиндексировать.

 $urls         =   filter_var($obj->entities->urls[0]->url, FILTER_SANITIZE_URL);