2011-08-19 1 views
1

장소에 전화 번호 목록을 지정하고 싶습니다. 일부 장소에는 전화 번호가 하나 있으며, 일부 지역에는 하나 이상의 전화 번호가 있습니다. 다른 사람들은 전혀 가지고 있지 않습니다.장소에 SimplexML 노드가 하나만있는 경우에도 항상 배열로 유지합니다.

$response->xml->phone_number; 

그러나 :

$xml->addChild('phone_number','555.555.5555'); 
$xml->addChild('phone_number','555.555.5556'); 

가 PHONE_NUMBER의 반복 가능한 배열을 생성

$xml->addChild('phone_number','555.555.5555'); 

비 반복 가능한 PHONE_NUMBER 텍스트 노드를 작성

문제는이 점이다 :

$response->xml->phone_number[0]; 
$response->xml->phone_number[1]; 

이렇게하면 클라이언트에 불필요한 부담이됩니다. 결과가 반복 가능한지 아닌지를 감지하고 그에 따라 코드를 수정해야합니다.

0 또는 1 개의 항목이 있더라도 항상 인터럽터 어레이를 다시 보낼 수 있다면 더 좋을 것입니다. 그러나이 작업을 수행하는 방법에 대한 문서를 찾을 수 없었습니다. Perl에서 나는 그것이 "forcearray"라고 믿는다. 그러나 필자는 PHP에 상응하는 것을 찾지 못했다.

답변

2

이이

<phone_numbers> 
    <phone_number>555.555.5555</phone_number> 
</phone_numbers> 

children() 방법 옆에 더 유연, 당신은 또한 수

예를 반환 항상 의지가 배열을 산출 xpath
을 고려할 수 고려해야한다

$xml = <<<XML 
<person> 
    <phone_numbers> 
    <phone_number>555.555.5555</phone_number> 
    </phone_numbers> 
</person> 
XML; 

$obj = simplexml_load_string($xml); 
$tels = $obj->xpath("//phone_numbers/*"); 

/* even more simple */ 
$tels = $obj->phone_numbers->children(); 
+0

나는 그것을했지만 동일한 문제가있다. 결과는 다음과 같을 것이라고 생각할 것입니다 : $ response-> xml-> phone_numbers-> phone_number [0]; 그러나 단 하나의 전화 번호가있을 때 실제로 결과는 다음과 같습니다. $ response-> xml-> phone_numbers-> phone_number; –

+0

방법 xpath 또는 children은 배열을 반환 할 수 있습니다 – ajreal

+0

@lo_fye - 죄송합니다. 원하는 답변이 아니므로 루프를 만들 수 있고 코드를 변경해야합니다. – ajreal

2

이 환상적인 마법 인터페이스 ($obj->xml->phone_number[x])를 사용하지 말고 항상 반복 가능한 객체를 반환하는 SimpleXMLElement::children() method을 사용하십시오.

관련 문제