За последние 24 часа нас посетили 20202 программиста и 1078 роботов. Сейчас ищет 731 программист ...

JSON разбор.

Тема в разделе "PHP для новичков", создана пользователем FullSilence, 23 апр 2018.

  1. FullSilence

    FullSilence Новичок

    С нами с:
    19 май 2017
    Сообщения:
    15
    Симпатии:
    0
    Адрес:
    Москва, Зеленоград
    Приветствую.
    Только начинаю разбирать РНР, не кидайте камнями сильно.

    Есть данные в виде JSON, нужно разобрать. Вроде все хорошо, справляюсь, но... Первый элемент это название таблицы, и они разные. Подскажите, плз, как мне добраться до metadata, columns минуя первый элемент?

    Мне не подходит foreach, мне нужно что-то типа $data->table[0]->columns.

    Код (Javascript):
    1. {
    2. "quotedsecurities": {
    3.     "metadata": {
    4.         "TRADEDATE": {"type": "date", "bytes": 10, "max_size": 0},
    5.         "SECID": {"type": "string", "bytes": 36, "max_size": 0},
    6.         "NAME": {"type": "string", "bytes": 765, "max_size": 0},
    7.         "ISIN": {"type": "string", "bytes": 765, "max_size": 0},
    8.         "REGNUMBER": {"type": "string", "bytes": 189, "max_size": 0},
    9.         "MAINBOARDID": {"type": "string", "bytes": 12, "max_size": 0},
    10.         "LISTLEVEL": {"type": "string", "bytes": 6, "max_size": 0},
    11.         "IS_QUOTED": {"type": "int32"}
    12.     },
    13.     "columns": ["TRADEDATE", "SECID", "NAME", "ISIN", "REGNUMBER", "MAINBOARDID", "LISTLEVEL", "IS_QUOTED"],
    14.     "data": [
    15.         ["2018-04-23", "ABBN", "АО \"Банк Астаны\"", "KZ1C00001023", null, "TQBR", null, 1],
    16.         ["2018-04-23", "ABRD", "Абрау-Дюрсо ПАО ао", "RU000A0JS5T7", "1-02-12500-A", "TQBR", null, 1],
    17.         ["2018-04-23", "ACKO", "СК ЮЖУРАЛ-АСКО ПАО ао", "RU000A0JXS91", "1-01-52065-Z", "TQDE", null, 1],
    18.         ["2018-04-23", "AFKS", "АФК \"Система\" ПАО ао", "RU000A0DQZE3", "1-05-01669-A", "TQBR", null, 1],
    19.         ["2018-04-23", "ZVEZ", "ЗВЕЗДА ПАО ао", "RU0009091300", "1-01-00169-D", "TQBR", null, 1]
    20.     ]
    21. },
    22. "quotedsecurities.dates": {
    23.     "metadata": {
    24.         "from": {"type": "date", "bytes": 30, "max_size": 0},
    25.         "till": {"type": "date", "bytes": 30, "max_size": 0}
    26.     },
    27.     "columns": ["from", "till"],
    28.     "data": [
    29.         ["2012-05-30", "2018-04-23"]
    30.     ]
    31. }}
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    array_combine ?
     
  3. FullSilence

    FullSilence Новичок

    С нами с:
    19 май 2017
    Сообщения:
    15
    Симпатии:
    0
    Адрес:
    Москва, Зеленоград
    Эммм. Это же из двух одномерных массивов создать один двумерный?
    Но проблема в том, если у меня будут эти массивы, то моя проблема решена.

    Мне нужно:
    1 - из metadata взять типы и размеры полей.
    2 - из columns взять названия полей.
    3 - создать, если нету по ним таблицу.
    4 - из data создать строки созданной таблицы.

    Я все это сделал, так:
    PHP:
    1.     private function сreateTable( $jsonData )
    2.     {
    3.         $columnNames        = [];
    4.         $bytes              = 0;
    5.         $max_size           = 0;
    6.         $createTableString  = 'CREATE TABLE IF NOT EXISTS quotedsecurities (';
    7.  
    8.         foreach ( $jsonData->quotedsecurities->columns as $columnName )
    9.         {
    10.             $column = $jsonData->quotedsecurities->metadata->$columnName;
    11.  
    12.             $type       = $column->type;
    13.             $bytes      = $column->bytes;
    14.             $max_size   = $column->max_size;
    15.  
    16.             if ( $type == 'date' )
    17.                 $bytes = null;
    18.  
    19.             $type = $this->convertType( $type );
    20.  
    21.             if ( !$bytes )
    22.                 $str = $columnName . ' ' . $type . ' ';
    23.             else
    24.                 $str = $columnName . ' ' . $type . " (".$bytes.") ";
    25.  
    26.             if ( !$columnNames )
    27.                 $columnNames = [$str];
    28.             else
    29.                 array_push($columnNames, $str );
    30.         }
    31.  
    32.         $createTableString .=  implode( ", ", $columnNames ) . ");";
    33.  
    34.         $this->connection->query( $createTableString );
    35.     }
    Но, в $jsonData->quotedsecurities, quotedsecurities может меняться. Т.е мне в метод нужно передать уже готовый элемент из $jsonData->quotedsecurities. Вот не пойму, как это сделать.
     
  4. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    Может тебе это чем-то поможет
    PHP:
    1. $json = '{
    2. "quotedsecurities": {
    3.    "metadata": {
    4.        "TRADEDATE": {"type": "date", "bytes": 10, "max_size": 0},
    5.        "SECID": {"type": "string", "bytes": 36, "max_size": 0},
    6.        "NAME": {"type": "string", "bytes": 765, "max_size": 0},
    7.        "ISIN": {"type": "string", "bytes": 765, "max_size": 0},
    8.        "REGNUMBER": {"type": "string", "bytes": 189, "max_size": 0},
    9.        "MAINBOARDID": {"type": "string", "bytes": 12, "max_size": 0},
    10.        "LISTLEVEL": {"type": "string", "bytes": 6, "max_size": 0},
    11.        "IS_QUOTED": {"type": "int32"}
    12.    },
    13.    "columns": ["TRADEDATE", "SECID", "NAME", "ISIN", "REGNUMBER", "MAINBOARDID", "LISTLEVEL", "IS_QUOTED"],
    14.    "data": [
    15.        ["2018-04-23", "ABBN", "АО \"Банк Астаны\"", "KZ1C00001023", null, "TQBR", null, 1],
    16.        ["2018-04-23", "ABRD", "Абрау-Дюрсо ПАО ао", "RU000A0JS5T7", "1-02-12500-A", "TQBR", null, 1],
    17.        ["2018-04-23", "ACKO", "СК ЮЖУРАЛ-АСКО ПАО ао", "RU000A0JXS91", "1-01-52065-Z", "TQDE", null, 1],
    18.        ["2018-04-23", "AFKS", "АФК \"Система\" ПАО ао", "RU000A0DQZE3", "1-05-01669-A", "TQBR", null, 1],
    19.        ["2018-04-23", "ZVEZ", "ЗВЕЗДА ПАО ао", "RU0009091300", "1-01-00169-D", "TQBR", null, 1]
    20.    ]
    21. },
    22. "quotedsecurities.dates": {
    23.    "metadata": {
    24.        "from": {"type": "date", "bytes": 30, "max_size": 0},
    25.        "till": {"type": "date", "bytes": 30, "max_size": 0}
    26.    },
    27.    "columns": ["from", "till"],
    28.    "data": [
    29.        ["2012-05-30", "2018-04-23"]
    30.    ]
    31. }}';
    32.  
    33. $parse = json_decode($json,true);
    34. var_dump(key($parse));//выведет "quotedsecurities"
    35. next($parse);//смещает указатель
    36. var_dump(key($parse));//выведет "quotedsecurities.dates"
     
    FullSilence нравится это.
  5. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Пока не понятно что тебе непонятно. Про сам подход не комментирую, но у тебя в одном свойстве объекта передается список полей с их количеством, в другом передаются данные которые соответствуют этой структуре (будем надеяться, потому как проверок нигде нет :)). С чем собственно проблема? Получить доступ к элементу массива содержащемуся в свойстве объекта?
     
    FullSilence нравится это.
  6. FullSilence

    FullSilence Новичок

    С нами с:
    19 май 2017
    Сообщения:
    15
    Симпатии:
    0
    Адрес:
    Москва, Зеленоград
    Да, именно так. Но я не знаю имя самого свойства. Вы за меня задали вопрос и я понял, как решить:
    Второй параметр решает мою проблему. Чувствую мне нужно в "Вопросы от блондинок" =))
    Спасибо вам обоим, пнули в нужном направлении.

    А что не так с подходом? Данные внешние, на них повлиять не могу.
     
  7. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Речь о том что большинство субд умеют делать экспорт/импорт в/из json и не надо городить огороды. Не комментирую потому, что не знаю кто вам эти данные отдает: здесь к сожалению не любят описывать задачу комплексно.
     
  8. FullSilence

    FullSilence Новичок

    С нами с:
    19 май 2017
    Сообщения:
    15
    Симпатии:
    0
    Адрес:
    Москва, Зеленоград
    Понял. Исправлюсь. =)

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

    Данные получаются посредством REST с сайта ММВБ.
    Мне нужно закешировать эти данные в моей БД, так как .json'ы приходят довольно объемные и нет смысла их дергать, при каждом переходе по ссылке. Пятиминутный лаг вполне допустим.
    Да и посредством одного .json'а эти данные не получить, нужно запрашивать несколько разных файлов. В общем это уже работа СУБД. Для чего мне нужно создать таблицу по запрошенным данным, если ее еще нет, и обновить/создать данные. Сколько этих ,json'ов будет, заранее неизвестно. Да и возможность масштабирования заложить нужно.
    После чего из базы делаются запросы уже к конкретным данным и выводятся в HTML.

    Фуууух. Воть. Извиняюсь за сумбурность.
     
  9. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    нужно перед созданием темы почитать документацию по используемым функциям.
    это дает представление о написанном коде и экономит массу времени.
     
  10. FullSilence

    FullSilence Новичок

    С нами с:
    19 май 2017
    Сообщения:
    15
    Симпатии:
    0
    Адрес:
    Москва, Зеленоград
    Полностью согласен!
    Дело в том, что в моем случае её нужно читать целиком, что в моем случае избыточно. Вот такой вот парадокс =)

    Для меня это написание маленькой тулзы на не профильном языке за пару вечеров после работы. И мне вполне достаточно маленького примера со стэковефлоу, что бы решить эту задачу.

    А с Вашей стороны это флуд =) Но, вполне обоснованный, ведь я действительно споткнулся о незнание того, что метод принимает дополнительные параметры. Непривычно мне, что редактор не показывает принимаемые параметры. Сработала привычка - Если больше не показывает, значит больше и не принимает =)

    Может посоветуете, если есть, редактор РНР с аналогом IntelliSense?
     
  11. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    phpstorm netbeans
    Чтения документации займет намного меньше времени чем ты потратишь на поиски решений на стаке в попытках что то слепить.
     
  12. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    придерживаюсь подхода "достаточно знать, что где-то там что-то такое есть и читать при необходимости" и норм :)
    у нас можно. Особенно, если проблема уже решена.
    PHPStorm - самый крутой
    NetBeans - бесплатный
     
  13. FullSilence

    FullSilence Новичок

    С нами с:
    19 май 2017
    Сообщения:
    15
    Симпатии:
    0
    Адрес:
    Москва, Зеленоград
    Ух, ты! Спасибо большое, даже дебагер есть!!!
    Да, понимаю я, но как же лень. С другой стороны, общение вскрывает темы в которых документация бессильна. Например, если ли бы не эта тема, я бы так и мучился с блокнотом, а теперь буду как белый человек с дебагером.

    ЗЫ. Про лень я не серьезно, (Как было сказано выше) просто нужно читать документацию по ИСПОЛЬЗУЕМЫМ методам. А для этого нужны примеры. =)
    --- Добавлено ---
    Да, согласен полностью, помешало отсутствие знания, что метод может принять больше параметров. Что вытекло из того, что не прочел документацию хотя-бы по конкретному методу. Как я уже говорил:

    Да, спасибо большое, уже посмотрел, скачал.
    Особенно дебагер - круто. Я то до этого в Блокноте++ писал :confused:
     
  14. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    а на чем пишешь, если не секрет?
     
  15. FullSilence

    FullSilence Новичок

    С нами с:
    19 май 2017
    Сообщения:
    15
    Симпатии:
    0
    Адрес:
    Москва, Зеленоград
    Плюсы, шарп.