За последние 24 часа нас посетили 22548 программистов и 1039 роботов. Сейчас ищут 664 программиста ...

JSON c русскими полями

Тема в разделе "PHP для новичков", создана пользователем andre2017, 3 авг 2017.

Метки:
  1. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    Здравствуйте,
    с сайта приходит JSON с русскими полями:
    {"Бухгалтерский баланс":{"Актив":{"I. ВНЕОБОРОТНЫЕ АКТИВЫ":{"Нематериальные активы":{"2015":"101459000","2014":"12866000","2013":"3650000","2012":"4250000","2011":"956238990000"}
    }}}}

    Я могу его раскодировать:
    var_dump(json_decode($json,true));

    Результат:
    object(stdClass)#6 (1) { ["Бухгалтерский баланс"]=> object(stdClass)#5 (1) { ["Актив"]=> object(stdClass)#4 (1) { ["I. ВНЕОБОРОТНЫЕ АКТИВЫ"]=> object(stdClass)#2 (2) { ["Нематериальные активы"]=> object(stdClass)#1 (5) { ["2015"]=> string(9) "101459000" ["2014"]=> string(8) "12866000" ["2013"]=> string(7) "3650000" ["2012"]=> string(7) "4250000" ["2011"]=> string(12) "956238990000" } ["Основные средства"]=> object(stdClass)#3 (5) { ["2015"]=> string(13) "1084316376000" ["2014"]=> string(13) "1063007530000" ["2013"]=> string(13) "1003457628000" ["2012"]=> string(12) "973476843000" ["2011"]=> string(12) "956238990000" } } } } }

    Или в массив:
    var_dump(json_decode($json,true));

    Результат:
    array(1) { ["Бухгалтерский баланс"]=> array(1) { ["Актив"]=> array(1) { ["I. ВНЕОБОРОТНЫЕ АКТИВЫ"]=> array(2) { ["Нематериальные активы"]=> array(5) { [2015]=> string(9) "101459000" [2014]=> string(8) "12866000" [2013]=> string(7) "3650000" [2012]=> string(7) "4250000" [2011]=> string(12) "956238990000" } ["Основные средства"]=> array(5) { [2015]=> string(13) "1084316376000" [2014]=> string(13) "1063007530000" [2013]=> string(13) "1003457628000" [2012]=> string(12) "973476843000" [2011]=> string(12) "956238990000" } } } } }

    Могу вытащить любое значение по ключу:
    $data = json_decode( $json,true);
    echo $data["Бухгалтерский баланс"]["Актив"]["I. ВНЕОБОРОТНЫЕ АКТИВЫ"]["Нематериальные активы"]["2015"];

    Результат:
    101459000

    Искал весь день, но не нашел, как же получить доступ по русским полям, если нужно в цикле вытаскивать данные вот так:

    Бухгалтерский баланс
    2015 2014 2013 2012 2011
    Актив
    I. ВНЕОБОРОТНЫЕ АКТИВЫ

    Нематериальные активы 101 459 000,00 12 866 000,00 3 650 000,00 4 250 000,00 4 876 000,00
    Основные средства 1 084 316 376 000,00 1 063 007 530 000,00 1 003 457 628 000,00 973 476 843 000,00 956 238 990 000,00

    Подскажите пожалуйста конструкцию при которой получается такой вид. Ругается у меня foreach на русские поля :-(
     
  2. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    У меня ничего не ругается, дай весь объект, код который ты пишешь и ошибки, которые выдает!
     
  3. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    я сделал в лоб, через переменные, тогда перестало ругаться. Так правильно? Подскажите пожалуйста как код упростить, в смысле, чтобы в цикле выводить по годам и названия полей брать из JSON. (это моя первая программа на PHP и я просмотрел сегодня сотню сайтов про PHP но пока не нашел подобные примеры, чтоб с кирилическими полями.)

    PHP:
    1. $data = json_decode($json);// обьект правильно? или с массивом лучше сделать?
    2.  
    3. $bbalans= "Бухгалтерский баланс";
    4. $activ= "Актив";
    5. $vneob= "I. ВНЕОБОРОТНЫЕ АКТИВЫ";
    6. $nemat= "Нематериальные активы";
    7. $osnov= "Основные средства";
    8.  
    9. echo $bbalans.' 2015 2014 2013 2012 2011'.'<br>';
    10. echo $activ.'<br>';
    11. echo $vneob.'<br>';
    12. echo $nemat.' ';
    13.  
    14. $year=2015; echo $data->$bbalans->$activ->$vneob->$nemat->$year.' ';
    15. $year=2014; echo $data->$bbalans->$activ->$vneob->$nemat->$year.' ';
    16. $year=2013; echo $data->$bbalans->$activ->$vneob->$nemat->$year.' ';
    17. $year=2012; echo $data->$bbalans->$activ->$vneob->$nemat->$year.' ';
    18. $year=2011; echo $data->$bbalans->$activ->$vneob->$nemat->$year.'<br>';
    19.  
    20. echo $osnov.' ';
    21. $year=2015; echo $data->$bbalans->$activ->$vneob->$osnov->$year.' ';
    22. $year=2014; echo $data->$bbalans->$activ->$vneob->$osnov->$year.' ';
    23. $year=2013; echo $data->$bbalans->$activ->$vneob->$osnov->$year.' ';
    24. $year=2012; echo $data->$bbalans->$activ->$vneob->$osnov->$year.' ';
    25. $year=2011; echo $data->$bbalans->$activ->$vneob->$osnov->$year.'<br>';
    JSON (некоторые данные отсутствуют - null, это норм.):

    {"Бухгалтерский баланс":{"Актив":{"I. ВНЕОБОРОТНЫЕ АКТИВЫ":{"Нематериальные активы":{"2015":"2291000","2014":"2590000","2013":"797000","2012":"0","2011":null},"Основные средства":{"2015":"0","2014":"16000","2013":"45000","2012":"74000","2011":null}...

    Результат:

    Бухгалтерский баланс 2015 2014 2013 2012 2011
    Актив
    I. ВНЕОБОРОТНЫЕ АКТИВЫ
    Нематериальные активы 2291000 2590000 797000 0
    Основные средства 0 16000 45000 74000
     
    #3 andre2017, 3 авг 2017
    Последнее редактирование: 3 авг 2017
  4. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    Я понял тебя, он ругается не на русский язык. В utf-8 ему по-моему пофиг какой язык :D

    Ему не нравятся пробелы, поэтому там нужно юзать фигурный синтаксис.
    PHP:
    1. foreach($data->{"Бухгалтерский баланс"}->Актив->{"I. ВНЕОБОРОТНЫЕ АКТИВЫ"}->{"Нематериальные активы"} as $year =>$summa){
    2.     print $summa."\n";
    3. }
    Разберешься теперь :)
     
    andre2017 нравится это.
  5. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    Огромное спасибо! Я пробовал фигурные скобки, но почему то не получилось. Прошу номер карты в ЛС. Отблагодарю и еще просьбы будут посложнее. Ибо foreach я никогда не пойму уже.
    Вот что получилось, в смысле заработало на сайте у меня:
    PHP:
    1. <?php
    2. $page = (@$_GET['page']) ? $_GET['page'] : 1;
    3.  
    4. if (@$_GET["id"]) {
    5.     $params["id"] = $_GET["id"];
    6.   $id = $_GET["id"];
    7.     if (@$_GET["fs"])
    8.         $url = "https://intechbank.ru/v5/data/fs";
    9.     else
    10.         $url = "https://intechbank.ru/v5/data/card";
    11. }
    12. elseif (@$_GET["search"]) {
    13.     $params["string"] = $_GET["search"];
    14.     $url = "https://intechbank.ru/v5/data?page=".$page;
    15. } else {
    16.     $params["string"] = "";
    17.     $url = "https://intechbank.ru/v5/data?page=".$page;
    18. }
    19.  
    20. $params["api_key"] = "xyIRQGFCCTnWSrWyonUt0_eqCOtqNoI";
    21. $params["ip_client"] = $_SERVER["REMOTE_ADDR"];
    22.  
    23. $opts = array("http" => array(
    24.     "method" => "POST",
    25.     "header" => "Content-type: application/x-www-form-urlencoded",
    26.     "content" => http_build_query($params),
    27.     "ignore_errors" => true
    28. ));
    29.  
    30. // ищем файл с таким ОГРН в кэше
    31. $filename = "CACHE/".$id.".txt";
    32. if (file_exists($filename))
    33. {
    34.     echo "Файл с ОГРН $id существует, берем из кэша".'<br>';
    35.    $json = file_get_contents($filename);
    36. }
    37. else
    38. {
    39.     echo "Файл c ОГРН $id не существует, делаем запрос".'<br>';
    40.     try {
    41.            $json = file_get_contents($url, false, stream_context_create($opts));
    42.         }
    43.             catch (Exception $e)
    44.         {
    45.           echo "Выброшено исключение: ", $e->getMessage(), "\n";
    46.         }
    47. // и добавляем файл в кэш
    48. $file = fopen($filename, "w");
    49. flock($file, LOCK_EX);
    50. fwrite($file, $json);
    51. flock($file, LOCK_UN);
    52. fclose($file);
    53. }
    54.  
    55. echo $json;
    56. echo '<hr>';
    57.  
    58. $data = json_decode($json);
    59. $bbalans= "Бухгалтерский баланс";
    60. $activ= "Актив";
    61. $vneob= "I. ВНЕОБОРОТНЫЕ АКТИВЫ";
    62. $nemat= "Нематериальные активы";
    63. $osnov= "Основные средства";
    64.  
    65. echo $bbalans.' 2015 2014 2013 2012 2011'.'<br>';
    66. echo $activ.'<br>';
    67. echo $vneob.'<br>';
    68.  
    69. echo $nemat.' ';
    70. foreach($data->{"Бухгалтерский баланс"}->Актив->{"I. ВНЕОБОРОТНЫЕ АКТИВЫ"}->{"Нематериальные активы"} as $year =>$summa){
    71.     print $summa."\n";
    72. } echo '<br>';
    73. echo '<br>';
    74.  
    75. echo $osnov.' ';
    76. foreach($data->{"Бухгалтерский баланс"}->Актив->{"I. ВНЕОБОРОТНЫЕ АКТИВЫ"}->{"Основные средства"} as $year =>$summa){
    77.     print $summa."\n";
    78. } echo '<br>';
    79.  
    80. ?>
    Мой первый опыт на РНР - с утра сижу-пишу, а щас уже 3:44 - теперь можно и спать, СПАСИБО!
     
  6. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    Это пустяк ерундовый, так что меня вполне устроит благодарность в виде нажатого пальца вверх. :)

    Если есть, что реально посложнее на php за денежку, то пиши в личку обсудим ) Или тут есть раздел с фрилансом. Напишешь ТЗ, может и исполнители поопытней найдутся )
     
    #6 Познающий php, 4 авг 2017
    Последнее редактирование: 4 авг 2017