2016-09-04 2 views
0

Я получаю статью/статьи из API. Объект JSON изменяется, некоторые статьи имеют свойства, которые некоторые другие не имеют.Разбор изменений JSON от API - какой шаблон дизайна использовать - PHP

Мне нужно перебирать элементы и управлять свойствами, если они установлены.

Каков наилучший способ справиться с этим?

На самом деле сейчас я сделать то, что я нахожу очень некрасиво ...

foreach ($items as $key => $item) { 
    if(isset($item->title)){ 
    $parsed[$key]['title'] = $this->formatTitle($item->title); 
    } 
    if(isset($item->salutation)){$parsed[$key]['salutation'] = $item->salutation;} 
    if(isset($item->eventDate) && isset($item->enventEndDate)){ 
    $parsed[$key]['eventDates'] = $this->ersDate($item->eventDate, $item->eventEndDate); 
    $parsed[$key]['startDateTimestamp'] = $this->toTimestamp($item->eventDate); 
    } elseif(isset($item->eventDate) && !isset($item->enventEndDate)){ 
    $parsed[$key]['eventDates'] = $this->ersDate($item->eventDate); 
    $parsed[$key]['startDateTimestamp'] = $this->toTimestamp($item->eventDate); 
     } 

//... code continues ...

+0

Этот вопрос может быть улучшен путем указания того, что именно вы подразумеваете под «лучшим способом» ... быстрее? более чистый вид? самой короткой? использование самой низкой памяти? –

ответ

1

Поскольку ваш источник имеет непредсказуемую форму, я не думаю, что есть какой-нибудь способ разбора данных ,

Вы можете абстрагировать уродство в виде отдельной функции, так что ваш главный скрипт просто делает:

$parsed = parseAPI($items); 

Если вы используете $items = json_decode($apiResponse,true), вы получите массив вместо объекта. Затем вы можете использовать операторы + на массивах вместе с массивом по умолчанию для передачи всех ответов API в одну и ту же форму.

$defaultItem = [ 
    'salutation' => null, 
    'eventDate' => null, 
    'eventEndDate' => null, 
    ... 
]; 

Теперь, когда вы получаете детали от API, вы можете сделать:

$items = json_decode($apiResponse,true); 
foreach($items as &$item) $item += $defaultItem; 

Теперь каждый член $items имеет все ключи, которые вы ожидаете. Если какой-либо ключ отсутствовал, был вставлен ключ и значение $defaultItem.

+0

Ницца. Спасибо. Почему вы выполняете цикл с помощью элемента по ссылке? – Samuel

+0

@Samuel без ссылки, изменения, внесенные в массив (через переменную цикла '$ item'), будут потеряны после цикла. Ссылка делает переменную цикла ссылкой на фактические члены '$ items'. Без этого '$ item' является просто копией. Если вы построите свое решение на основе этого ответа, не забудьте выбрать и переместить. – BeetleJuice

+0

Спасибо. Имеет смысл. Да, я буду реорганизовать этот путь. – Samuel

Смежные вопросы