2016-09-04 20 views
0

我從API獲取文章/文章。 JSON對象各不相同,有些文章具有其他文章沒有的屬性。解析從API更改JSON - 使用什麼設計模式 - 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