За последние 24 часа нас посетил 22941 программист и 1234 робота. Сейчас ищут 756 программистов ...

вложенный ассоциативный массив

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

  1. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    Приходит строка JSON:

    Код (Text):
    1. {"total":2,"docs":[{"id":"1027700070518","ТипДокумента":"ul","НаимЮЛСокр":"ПАО \"ГАЗПРОМ\"","НаимЮЛПолн":"ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО \"ГАЗПРОМ\"","Активность":"Действующее","ИНН":"7736050003","КПП":"772801001","ОбрДата":"25.02.1993","Адрес":"117420, г Москва, улица Намёткина, дом 16","КодОКВЭД":"46.71","НаимОКВЭД":"Торговля оптовая твердым, жидким и газообразным топливом и подобными продуктами","Руководитель":["Миллер Алексей Борисович"]},{"id":"1061515009555","ТипДокумента":"ul","НаимЮЛСокр":null,"НаимЮЛПолн":"ГАЗПРОМ  ОАО","Активность":"Ликвидировано","ИНН":"7736050003","КПП":"151541001","ОбрДата":"02.06.2002","Адрес":"респ Северная Осетия - Алания, город Владикавказ","КодОКВЭД":null,"НаимОКВЭД":null,"Руководитель":null}]}
    Видно, что список руководителей хранится во вложенном массиве. Остальные поля вытаскиваю так:
    PHP:
    1.  $data = json_decode($spisok);
    2. foreach($data->docs as $v){
    3.             echo $v->{'ИНН'};
    4. ...
    5. echo $v->{'НаимОКВЭД'};
    А вот руководителей не могу вытащить:
    PHP:
    1.  
    2.  echo $data->docs->{'Руководитель'[0]} ;
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    может все-же
    PHP:
    1. echo $data->docs->{'Руководитель'}[0] ;
    ??
     
    andre2017 нравится это.
  3. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    так я уже пробовал - не выводит в этом поле ничего:
    PHP:
    1.  $data = json_decode($spisok);
    2. foreach($data->docs as $v){
    3.             $Spisok_Comp .=  '<b>ИНН</b> '.$v->{'ИНН'}.'<br><b>ОГРН</b> '.$v->id.' <br><b>Наименование</b> '.$v->{'НаимЮЛПолн'}.' <br><b>Активность</b> '.$v->{'Активность'}.'<br><b>КПП</b> '.$v->{'КПП'}.'<br><b>Дата образования</b> '.$v->{'ОбрДата'}.'<br><b>Адрес регистрации</b> '.$v->{'Адрес'}.'<br><b>Код ОКВЭД</b> '.$v->{'КодОКВЭД'}.'<br><b>НаимОКВЭД</b> '.$v->{'НаимОКВЭД'}.'<br><b>Руководcтво</b> '. $data->docs->{'Руководитель'}[0];
    4.     }
     

    Вложения:

    • кглщм.jpg
      кглщм.jpg
      Размер файла:
      53,6 КБ
      Просмотров:
      0
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    судя по вашей строке - Руководитель вообще не массив, и потому обращаться к нему по индексу бессмысленно
    просто -
    PHP:
    1. echo $data->docs->{'Руководитель'}
     
    andre2017 нравится это.
  5. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    как не массив?! А квадратные скобки?
    просто в примере только один элемент. возможно бывают и с двумя руководителями предприятия.
    --- Добавлено ---
    echo$data->docs->{'Руководитель'} - так тоже пробовал, ничего не выводит естественно.
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    а почему у вас тут так, а для руководителя по другому?
    PHP:
    1. $v->{'НаимОКВЭД'}.'<br><b>Руководcтво</b> '. $data->docs->{'Руководитель'}[0]
    наверное
    PHP:
    1. $v->{'Руководитель'}[0]
     
    andre2017 нравится это.
  7. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    да, вы правы, сейчас гораздо лучше !

    Ну а если там будет несколько элементов? как их перебрать? на всякий случай...
     

    Вложения:

  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    PHP:
    1. $vse = implode(",",$v->{'Руководитель'});
     
    andre2017 нравится это.
  9. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    работает, но ругается:
    Миллер Алексей Борисович, Иванов
    Warning: implode(): Invalid arguments passed

    PHP:
    1. foreach($data->docs as $v){
    2.             $Spisok_Comp .= '<b>ИНН</b> '.$v->{'ИНН'}.'<br><b>ОГРН</b> '.$v->id.' <br><b>Наименование</b> '.$v->{'НаимЮЛПолн'}.' <br><b>Активность</b> '.$v->{'Активность'}.'<br><b>КПП</b> '.$v->{'КПП'}.'<br><b>Дата образования</b> '.$v->{'ОбрДата'}.'<br><b>Адрес регистрации</b> '.$v->{'Адрес'}.'<br><b>Код ОКВЭД</b> '.$v->{'КодОКВЭД'}.'<br><b>НаимОКВЭД</b> '.$v->{'НаимОКВЭД'}.'<br><b>Руководcтво</b> ';  
    3. $f = implode($v->{",",'Руководитель'} );
    4. $Spisok_Comp .=  $f;
    5. }
    так тоже ругается: $f = implode($v->{'Руководитель'},"," );
    наверное имплоде не любит обьекты.
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    Имплоде жутко не любит когда скопипастить даже не могут, а ещё не любит когда вместо массива подсовывают что то другое, например null
    Потому - сначала надо проверить, а массив ли это вообще...
    Но если и это покажу - вы должны будете меня на полставки устроить к себе )))
     
    andre2017 нравится это.
  11. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    ну это я пробовал по разному.. все равно ругается. но все равно спасибо, буду разбираться!

    json: ..,"Руководитель":["Миллер Алексей Борисович","Иванов"]}

    PHP:
    1. foreach($data->docs as $v){
    2.             $Spisok_Comp .= '<b>ИНН</b> '.$v->{'ИНН'}.'<br><b>ОГРН</b> '.$v->id.' <br><b>Наименование</b> '.$v->{'НаимЮЛПолн'}.' <br><b>Активность</b> '.$v->{'Активность'}.'<br><b>КПП</b> '.$v->{'КПП'}.'<br><b>Дата образования</b> '.$v->{'ОбрДата'}.'<br><b>Адрес регистрации</b> '.$v->{'Адрес'}.'<br><b>Код ОКВЭД</b> '.$v->{'КодОКВЭД'}.'<br><b>НаимОКВЭД</b> '.$v->{'НаимОКВЭД'}.'<br><b>Руководcтво</b> ';
    3. $vse = implode(",",$v->{'Руководитель'});
    4. $Spisok_Comp .=  $vse;
    5. }
    вывод: Руководcтво Миллер Алексей Борисович,Иванов
    Warning
    : implode(): Invalid arguments passed in ..
     
  12. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    Разобрался, оказывается в оригинальном JSONe может приходить массив, а может быть NULL.
    Создал тестовый JSON:
    Код (Javascript):
    1. {"total":3,"docs":[
    2.  
    3. {"id":"1027700070518","ТипДокумента":"ul","НаимЮЛСокр":"ПАО \"ГАЗПРОМ\"","НаимЮЛПолн":"ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО \"ГАЗПРОМ\"","Активность":"Действующее","ИНН":"7736050003","КПП":"772801001","ОбрДата":"25.02.1993","Адрес":"117420, г Москва, улица Намёткина, дом 16","КодОКВЭД":"46.71","НаимОКВЭД":"Торговля оптовая твердым, жидким и газообразным топливом и подобными продуктами","Руководитель":["Миллер Алексей Борисович"]},
    4.  
    5. {"id":"1027700070518","ТипДокумента":"ul","НаимЮЛСокр":"ПАО \"ГАЗПРОМ\"","НаимЮЛПолн":"ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО \"ГАЗПРОМ\"","Активность":"Действующее","ИНН":"7736050003","КПП":"772801001","ОбрДата":"25.02.1993","Адрес":"117420, г Москва, улица Намёткина, дом 16","КодОКВЭД":"46.71","НаимОКВЭД":"Торговля оптовая твердым, жидким и газообразным топливом и подобными продуктами","Руководитель":["Миллер Алексей Борисович", "Иванов Иван Иванович"]},
    6.  
    7. {"id":"1061515009555","ТипДокумента":"ul","НаимЮЛСокр":null,"НаимЮЛПолн":"ГАЗПРОМ  ОАО","Активность":"Ликвидировано","ИНН":"7736050003","КПП":"151541001","ОбрДата":"02.06.2002","Адрес":"респ Северная Осетия - Алания, город Владикавказ","КодОКВЭД":null,"НаимОКВЭД":null,"Руководитель":null}
    8.  
    9. ]}
    PHP:
    1. foreach($data->docs as $v){
    2.             $Spisok_Comp .= '<b>ИНН</b> '.$v->{'ИНН'}.'<br><b>ОГРН</b> '.$v->id.' <br><b>Наименование</b> '.$v->{'НаимЮЛПолн'}.' <br><b>Активность</b> '.$v->{'Активность'}.'<br><b>КПП</b> '.$v->{'КПП'}.'<br><b>Дата образования</b> '.$v->{'ОбрДата'}.'<br><b>Адрес регистрации</b> '.$v->{'Адрес'}.'<br><b>Код ОКВЭД</b> '.$v->{'КодОКВЭД'}.'<br><b>НаимОКВЭД</b> '.$v->{'НаимОКВЭД'}.'<br><b>Руководcтво</b> ';
    3. $ff = $v->{'Руководитель'};
    4. var_dump ( $ff);
    5. //$f = array();  кстати обьявлял как массив, но имплоде все равно ругался
    6. if (is_array($ff)) $f = implode(",", $ff); else $f = $ff;
    7. $Spisok_Comp .=  $f;
    8. }
    Результат (только руководство):
    Руководcтво Миллер Алексей Борисович
    Руководcтво Миллер Алексей Борисович,Иванов Иван Иванович
    Руководcтво

    Спасибо, что уделили мне время :)

    --- Добавлено ---
    Насчет полставки, я не против. Обращайтесь в личку.
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    я делаю так:
    PHP:
    1. $data = json_decode($spisok, true);
    2. var_dump ($spisok);
    второй параметр в тру и будет ассоциативный массив без шаманства
     
    TeslaFeo нравится это.
  14. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    нет шаманства. проблема была в том, что данные приходят то с вложенным массивом, то без.
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    я про второй параметр писал
     
  16. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    да... я знаю про этот параметр, но че то пока еще не заметил преимуществ работы с массивами, нежели с обьектами. может быть в дальнейшем этот параметр где-то упростит программу.
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Как насчет более удобной абстрактной адресации?
     
  18. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    $v->{'ИНН'}
    $v=>["ИНН"]
    не вижу особой разницы.
     
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    А еще не знаете, как пользоваться массивами.
     
  20. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Человеку, который спрашивает на форуме (сам не может разобраться) про это:
    лучше не подходить к ООП.
    Учись писать в процедурном стиле. До ООП еще доберешься.