Приветствую. Только начинаю разбирать РНР, не кидайте камнями сильно. Есть данные в виде JSON, нужно разобрать. Вроде все хорошо, справляюсь, но... Первый элемент это название таблицы, и они разные. Подскажите, плз, как мне добраться до metadata, columns минуя первый элемент? Мне не подходит foreach, мне нужно что-то типа $data->table[0]->columns. Код (Javascript): { "quotedsecurities": { "metadata": { "TRADEDATE": {"type": "date", "bytes": 10, "max_size": 0}, "SECID": {"type": "string", "bytes": 36, "max_size": 0}, "NAME": {"type": "string", "bytes": 765, "max_size": 0}, "ISIN": {"type": "string", "bytes": 765, "max_size": 0}, "REGNUMBER": {"type": "string", "bytes": 189, "max_size": 0}, "MAINBOARDID": {"type": "string", "bytes": 12, "max_size": 0}, "LISTLEVEL": {"type": "string", "bytes": 6, "max_size": 0}, "IS_QUOTED": {"type": "int32"} }, "columns": ["TRADEDATE", "SECID", "NAME", "ISIN", "REGNUMBER", "MAINBOARDID", "LISTLEVEL", "IS_QUOTED"], "data": [ ["2018-04-23", "ABBN", "АО \"Банк Астаны\"", "KZ1C00001023", null, "TQBR", null, 1], ["2018-04-23", "ABRD", "Абрау-Дюрсо ПАО ао", "RU000A0JS5T7", "1-02-12500-A", "TQBR", null, 1], ["2018-04-23", "ACKO", "СК ЮЖУРАЛ-АСКО ПАО ао", "RU000A0JXS91", "1-01-52065-Z", "TQDE", null, 1], ["2018-04-23", "AFKS", "АФК \"Система\" ПАО ао", "RU000A0DQZE3", "1-05-01669-A", "TQBR", null, 1], ["2018-04-23", "ZVEZ", "ЗВЕЗДА ПАО ао", "RU0009091300", "1-01-00169-D", "TQBR", null, 1] ] }, "quotedsecurities.dates": { "metadata": { "from": {"type": "date", "bytes": 30, "max_size": 0}, "till": {"type": "date", "bytes": 30, "max_size": 0} }, "columns": ["from", "till"], "data": [ ["2012-05-30", "2018-04-23"] ] }}
Эммм. Это же из двух одномерных массивов создать один двумерный? Но проблема в том, если у меня будут эти массивы, то моя проблема решена. Мне нужно: 1 - из metadata взять типы и размеры полей. 2 - из columns взять названия полей. 3 - создать, если нету по ним таблицу. 4 - из data создать строки созданной таблицы. Я все это сделал, так: PHP: private function сreateTable( $jsonData ) { $columnNames = []; $bytes = 0; $max_size = 0; $createTableString = 'CREATE TABLE IF NOT EXISTS quotedsecurities ('; foreach ( $jsonData->quotedsecurities->columns as $columnName ) { $column = $jsonData->quotedsecurities->metadata->$columnName; $type = $column->type; $bytes = $column->bytes; $max_size = $column->max_size; if ( $type == 'date' ) $bytes = null; $type = $this->convertType( $type ); if ( !$bytes ) $str = $columnName . ' ' . $type . ' '; else $str = $columnName . ' ' . $type . " (".$bytes.") "; if ( !$columnNames ) $columnNames = [$str]; else array_push($columnNames, $str ); } $createTableString .= implode( ", ", $columnNames ) . ");"; $this->connection->query( $createTableString ); } Но, в $jsonData->quotedsecurities, quotedsecurities может меняться. Т.е мне в метод нужно передать уже готовый элемент из $jsonData->quotedsecurities. Вот не пойму, как это сделать.
Может тебе это чем-то поможет PHP: $json = '{ "quotedsecurities": { "metadata": { "TRADEDATE": {"type": "date", "bytes": 10, "max_size": 0}, "SECID": {"type": "string", "bytes": 36, "max_size": 0}, "NAME": {"type": "string", "bytes": 765, "max_size": 0}, "ISIN": {"type": "string", "bytes": 765, "max_size": 0}, "REGNUMBER": {"type": "string", "bytes": 189, "max_size": 0}, "MAINBOARDID": {"type": "string", "bytes": 12, "max_size": 0}, "LISTLEVEL": {"type": "string", "bytes": 6, "max_size": 0}, "IS_QUOTED": {"type": "int32"} }, "columns": ["TRADEDATE", "SECID", "NAME", "ISIN", "REGNUMBER", "MAINBOARDID", "LISTLEVEL", "IS_QUOTED"], "data": [ ["2018-04-23", "ABBN", "АО \"Банк Астаны\"", "KZ1C00001023", null, "TQBR", null, 1], ["2018-04-23", "ABRD", "Абрау-Дюрсо ПАО ао", "RU000A0JS5T7", "1-02-12500-A", "TQBR", null, 1], ["2018-04-23", "ACKO", "СК ЮЖУРАЛ-АСКО ПАО ао", "RU000A0JXS91", "1-01-52065-Z", "TQDE", null, 1], ["2018-04-23", "AFKS", "АФК \"Система\" ПАО ао", "RU000A0DQZE3", "1-05-01669-A", "TQBR", null, 1], ["2018-04-23", "ZVEZ", "ЗВЕЗДА ПАО ао", "RU0009091300", "1-01-00169-D", "TQBR", null, 1] ] }, "quotedsecurities.dates": { "metadata": { "from": {"type": "date", "bytes": 30, "max_size": 0}, "till": {"type": "date", "bytes": 30, "max_size": 0} }, "columns": ["from", "till"], "data": [ ["2012-05-30", "2018-04-23"] ] }}'; $parse = json_decode($json,true); var_dump(key($parse));//выведет "quotedsecurities" next($parse);//смещает указатель var_dump(key($parse));//выведет "quotedsecurities.dates"
Пока не понятно что тебе непонятно. Про сам подход не комментирую, но у тебя в одном свойстве объекта передается список полей с их количеством, в другом передаются данные которые соответствуют этой структуре (будем надеяться, потому как проверок нигде нет ). С чем собственно проблема? Получить доступ к элементу массива содержащемуся в свойстве объекта?
Да, именно так. Но я не знаю имя самого свойства. Вы за меня задали вопрос и я понял, как решить: Второй параметр решает мою проблему. Чувствую мне нужно в "Вопросы от блондинок" =)) Спасибо вам обоим, пнули в нужном направлении. А что не так с подходом? Данные внешние, на них повлиять не могу.
Речь о том что большинство субд умеют делать экспорт/импорт в/из json и не надо городить огороды. Не комментирую потому, что не знаю кто вам эти данные отдает: здесь к сожалению не любят описывать задачу комплексно.
Понял. Исправлюсь. =) Пытаюсь написать для себя маленькую следилку-напоминалку по моим активам на бирже, что бы при достижении акцией определенной цены приходило сообщение со ссылкой в ... Куда-нить, например телеграмм, сейчас не важно. При переходе по ссылке мне нужно отобразить текущие данные по акции. Данные получаются посредством REST с сайта ММВБ. Мне нужно закешировать эти данные в моей БД, так как .json'ы приходят довольно объемные и нет смысла их дергать, при каждом переходе по ссылке. Пятиминутный лаг вполне допустим. Да и посредством одного .json'а эти данные не получить, нужно запрашивать несколько разных файлов. В общем это уже работа СУБД. Для чего мне нужно создать таблицу по запрошенным данным, если ее еще нет, и обновить/создать данные. Сколько этих ,json'ов будет, заранее неизвестно. Да и возможность масштабирования заложить нужно. После чего из базы делаются запросы уже к конкретным данным и выводятся в HTML. Фуууух. Воть. Извиняюсь за сумбурность.
нужно перед созданием темы почитать документацию по используемым функциям. это дает представление о написанном коде и экономит массу времени.
Полностью согласен! Дело в том, что в моем случае её нужно читать целиком, что в моем случае избыточно. Вот такой вот парадокс =) Для меня это написание маленькой тулзы на не профильном языке за пару вечеров после работы. И мне вполне достаточно маленького примера со стэковефлоу, что бы решить эту задачу. А с Вашей стороны это флуд =) Но, вполне обоснованный, ведь я действительно споткнулся о незнание того, что метод принимает дополнительные параметры. Непривычно мне, что редактор не показывает принимаемые параметры. Сработала привычка - Если больше не показывает, значит больше и не принимает =) Может посоветуете, если есть, редактор РНР с аналогом IntelliSense?
phpstorm netbeans Чтения документации займет намного меньше времени чем ты потратишь на поиски решений на стаке в попытках что то слепить.
придерживаюсь подхода "достаточно знать, что где-то там что-то такое есть и читать при необходимости" и норм у нас можно. Особенно, если проблема уже решена. PHPStorm - самый крутой NetBeans - бесплатный
Ух, ты! Спасибо большое, даже дебагер есть!!! Да, понимаю я, но как же лень. С другой стороны, общение вскрывает темы в которых документация бессильна. Например, если ли бы не эта тема, я бы так и мучился с блокнотом, а теперь буду как белый человек с дебагером. ЗЫ. Про лень я не серьезно, (Как было сказано выше) просто нужно читать документацию по ИСПОЛЬЗУЕМЫМ методам. А для этого нужны примеры. =) --- Добавлено --- Да, согласен полностью, помешало отсутствие знания, что метод может принять больше параметров. Что вытекло из того, что не прочел документацию хотя-бы по конкретному методу. Как я уже говорил: Да, спасибо большое, уже посмотрел, скачал. Особенно дебагер - круто. Я то до этого в Блокноте++ писал