2016-09-04 1 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'은 단지 복사본 일뿐입니다. 이 답변을 바탕으로 솔루션을 구축한다면 upvote를 선택하는 것을 잊지 마십시오. – BeetleJuice

+0

감사합니다. 말이된다. 그래, 나는이 방법으로 리펙토링 할 것이다. – Samuel