Python conf in Kharkiv, Nov 16 with Intel, Elastic engineering leaders. Prices go up 21.10

Распарсить JSON PHP. Не работает!

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

Есть данные

"included": [
    {
      "id": "31259521",
      "type": "vacancyDetailInfo",
      "attributes": {
        "duties": "Увеличивать объемы продаж;\nНарабатывать клиентскую базу, привлекать новых клиентов - крупных застройщиков.\nКомплектовать строительные объекты ассортиментом компании;\nПостоянно общаться со своими клиентами;\nЗаключать договора, контролировать дебиторскую задолженность.",
        "requirements": "Умение грамотно вести переговоры с потенциальным клиентом и продавать;\nОпыт наработки клиентской базы;\nЗнание документооборота, первичной бухгалтерской документации;\nСпособность работать с большим объемом информации по товару;\nГотовность к разъездной работе по городу- до 30 % рабочего времени;\nОБЯЗАТЕЛЬНО наличие автомобиля.",
        "conditions": "Трудоустройство по ТК;\nВозможность зарабатывать высокий доход: оклад +% от продаж;\nКомпенсация ГСМ и мобильной связи;\nОбучение по ассортименту компании в процессе работы;\nГрафик работы: понедельник-пятница с 9.00 до 18.00;\nМолодой и современный коллектив, интересные, пользующиеся спросом продукты.\nнапротив маг. \"Малыш\"",
        "archivedAt": "2019-01-21T12:32:55+03:00",
        "isCommercial": true,
        "isResumeRequired": true,
        "isRemoteWork": false,
        "externalResponseUrl": ""
      },
      "relationships": {
        
      }
    },
    {
      "id": "31259521",
      "type": "vacancyMainInfo",
      "attributes": {
        "profession": "Менеджер по развитию продаж на строительные объекты",
        "createdAt": "2019-02-14T17:45:32+03:00",
        "updatedAt": "2019-03-04T17:45:32+03:00",
        "minSalary": 0,
        "maxSalary": 0,
        "highlight": true
      },
      "relationships": {
        
      }
    },

пытаюсь их структурировать в один массив взяв только нужные элементы.

$obj = json_decode($data,true);

$mas=array();
for ($i = 0; $i <count($obj['included']); $i++) {   

 if ($obj['included'][$i]['type']='vacancyDetailInfo'){
    $id=$obj['included'][$i]['id'];

    $mas[$id]['duties']= $obj['included'][$i]['attributes']['duties'];
    $mas[$id]['requirements']= $obj['included'][$i]['attributes']['requirements'];
    $mas[$id]['conditions']= $obj['included'][$i]['attributes']['conditions'];
 }

 if ($obj['included'][$i]['type']='vacancyMainInfo'){
     $id=$obj['included'][$i]['id'];

     $mas[$id]['profession']= $obj['included'][$i]['attributes']['profession'];
     $mas[$id]['minSalary']= $obj['included'][$i]['attributes']['minSalary'];
     $mas[$id]['maxSalary']= $obj['included'][$i]['attributes']['maxSalary'];
 }

}

print_r ($mas);

в итоге получаю массив такого вида

Array
(
    [31259521] => Array
        (
            [duties] => 
            [requirements] => 
            [conditions] => 
            [profession] => Менеджер по развитию продаж на строительные объекты
            [minSalary] => 0
            [maxSalary] => 0
        )

    [31780640] => Array
        (
            [duties] => 
            [requirements] => 
            [conditions] => 
            [profession] => Энергетик, специалист по охране труда и промышленной безопасности
            [minSalary] => 40000
            [maxSalary] => 0
        )

почему к duties, requirements, conditions не считывается, точнее в массив не добавляется? а если обратится так

echo $obj[’included’][0][’attributes’][’duties’];
то его содержимое нормально отображается?

LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

а почему не посмотреть print_r($obj) после строки

$obj = json_decode($data,true);

попробуй посмотреть на готовые решения для парсинга JsonApi (jsonapi.org/) packagist.org/?query=json-api
может оказаться, что будет все намного проще

Раз тут уже пошли советы из code style, то обрати внимание на следующие два, фактически, стандарта PHP code style, котрые позволили бы тебе избежать этой ошибки (symfony.com/...​ing/code/standards.html)

Always use identical comparison (php.net/...​.operators.comparison.php) unless you need type juggling;
Use Yoda conditions (en.wikipedia.org/wiki/Yoda_conditions) when checking a variable against an expression to avoid an accidental assignment inside the condition statement (this applies to ==, !=, ===, and !==);

Т.е. твое условие в if должно выглядеть как
if ('vacancyDetailInfo' === $obj['included'][$i]['type'])
— привыкни придерживаться этих стандартов code style и подобных ошибок в дальнейшем ты избежишь.

Я бы ещё добавил если появляются такие проблемы то можно использовать or, eq, neq операторы вместо ||, ==, !=

А в php есть eq/neq? Да и вообще, самое лучшее сравнение — строгое. Так надежнее

совет по code style — это очень хорошо, но не надо приводить ссылку на стиль конкретного фреймворка, лучше уж смотреть на стандарт для языка www.php-fig.org/psr/psr-2
(да и вообще на PSR-* вцелом).

и да, Йода нотация спорный вопрос и не однозначный. использовать его или нет — обычно договоренность команды, хотя в коде автора использование йоды сразу бы показало неработоспособность кода.

Почему же не нужно, если рекоммендации Symfony по существу, стандарт такого же уровня в enterprise PHP разработке, как и PSR? Ровно то же касается и йода нотации — что здесь спорного, в чем возможные минусы его использования? Подскажите, пожалуйста, а то я не встречал ни одного senior PHP девелопера из десятков мне знакомых, у которых бы вызывала сомнения целесообразность применения йода-нотаций — ну, может не задумывался особого глубоко никто — если есть возможные минусы — подскажите, пожалуйста, я также буду учитывать их в дальнейшей практике.

Спасибо.

P. S.: В части ориентации на PSR как на основные стандарты code style (да и вообще стандарты PHP) Вы правы, конечно, начинать лучше с них.

Ровно то же касается и йода нотации — что здесь спорного, в чем возможные минусы его использования?

Не вижу минусов, но никогда не использовал — мне она просто не очень нравится, да и ошибку я такую допускаю нечасто

Докатились! JSON не могут в пыхе распарсить, на DOU пишут. Что дальше, домашку за 4й класс попросишь сделать?

/#########################################################/
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@@@@@         @@@          @        @      %@#      @@@@@#
#@@@@@          #@          @        @       @       @@@@@#
#@@@@@     @     @@@(    @@@@     @@@@       @       @@@@@#
#@@@@@     @    ,@@@(    @@@@     @@@@    .  @  /    @@@@@#
#@@@@@        (@@@@@(    @@@@       .@    @     #    @@@@@#
#@@@@@     @    ,@@@(    @@@@     &&&@    @     #    @@@@@#
#@@@@@     @     @@@(    @@@@     @@@@    @     #    @@@@@#
#@@@@@     @     @@@(    @@@@     @@@@    @%   (#    @@@@@#
#@@@@@     @     @@@(    @@@@     @@@@    @@   @#    @@@@@#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#                                                                                                                                          

Тут уже в-принципе ответили про дублирующиеся айдишники и ==. Хотелось бы добавить по стилю: используй foreach вместо for везде где можно — так будет намного проще читать и виднее ошибки. Например (ошибку с == не исправлял специально):

$obj = json_decode($data,true);

$mas = [];
foreach ($obj['included'] as $included) {   
  $attributes = $included['attributes'];

  if ($included['type'] = 'vacancyDetailInfo'){
    $id=$included['id'];

    $mas[$id]['duties'] = $attributes['duties'];
    $mas[$id]['requirements'] = $attributes['requirements'];
    $mas[$id]['conditions'] = $attributes['conditions'];
  }

  if ($included['type'] = 'vacancyMainInfo'){
    $id=$included['id'];

    $mas[$id]['profession'] = $attributes['profession'];
    $mas[$id]['minSalary'] = $attributes['minSalary'];
    $mas[$id]['maxSalary'] = $attributes['maxSalary'];
  }

}

print_r($mas);

для валидации json использую jsonformatter.org и у тебя в коде перезатерание ид 31259521 он и ствит пустую строку

$id=$obj[’included’][$i][’id’];

да и в условии == или ===

if ($obj[’included’][$i][’type’]==’vacancyMainInfo’){

у тебя одно равно вместо двух

Выложите данные в текстовом формате, а не скриншот.

Подписаться на комментарии