2013-07-08 81 views
3

我創建了以下PHP腳本來顯示我們使用的SOAP API中的屬性列表。PHP分析SOAP響應的問題

當我們有多個屬性被廣告時,該腳本正常工作,但是當我們只有一個屬性被廣告時什麼也沒有顯示。

任何人都可以告訴我我做錯了什麼或一個簡單的檢查,可以解決問題嗎?

我的代碼是:

$wsdl = "http://portal.letmc.com/PropertySearchService.asmx?WSDL"; 

$client = new SoapClient($wsdl, array ("trace"=>1, "exceptions"=>0)); 

$strClientID = "{xxxx-xxxx-xxxx-xxxx}"; 
$strBranchID = "{xxxx-xxxx-xxxx-xxxx}";       
$nMaxResults = "5"; 
$nRentMinimum = 100; 
$nRentMaximum = 900; 
$nMaximumTenants = 5;       

$parameters = array( "strClientID"=>$strClientID, 
        "strBranchID"=>$strBranchID, 
        "nMaxResults"=>$nMaxResults, 
        "nRentMinimum"=>$nRentMinimum, 
        "nRentMaximum"=>$nRentMaximum, 
        "nMaximumTenants"=>$nMaximumTenants 
       );       

$values = $client->SearchProperties($parameters); 


if($values != '') 
{ 
echo "<table>"; 
     echo '<tr> 
       <th>Apartment</th> 
       <th class="center">Bedrooms</th> 
       <th>Rent</th> 
       <th>Description</th> 
      </tr>'; 

    foreach ($values->SearchPropertiesResult->PropertyInfo as $message) 
    { 
     $address = $message->Address1; 
     $rooms = $message->MaxTenants; 
     $rent = $message->Rent; 
     $description = $message->Description; 

     echo '<tr>';   
     echo '<td>'. $address .'</td> 
        <td class="center">'. $rooms .'</td> 
       <td>'. $rent .'</td> 
       <td>'. $description .'</td>'; 
     echo '</tr>'; 

    } 
    echo '</table>'; 
} 

else 
{ 
echo '<p><strong>Sorry, we have no properties available.</strong></p> <p>Please register your details on the right and we will let you know as soon as an apartment comes available.</p>'; 
} 

回答

0

這是.NET Web服務普遍。如果結果不止一個,那麼它是一個數組,但如果只有一個結果,而不是具有一個結果的數組,則可以在PropertyInfo中得到結果本身。

解決方案是測試它是否是數組,如果不是,則將該對象移動到數組中,以便以同樣的方式處理單個結果和結果數組。

在你的SearchProperties()調用之後和foreach之前添加此代碼。

if(!is_array($values->SearchPropertiesResult->PropertyInfo)) 
{ 
    $values->SearchPropertiesResult->PropertyInfo = array($values->SearchPropertiesResult->PropertyInfo); 
} 

在此之後,現在$values->SearchPropertiesResult->PropertyInfo是一個數組,而不管只具有單個屬性或多個它的。所以你的foreach將起作用。

+0

工作過的一種享受 - 謝謝! –

3

您可以將PHP SoapClient配置爲不將單個元素數組轉換爲元素本身。使用「功能」鍵,在選項參數並將其設置爲SOAP_SINGLE_ELEMENT_ARRAYS這樣的:

$options = array('features' => SOAP_SINGLE_ELEMENT_ARRAYS); 
$client = new SoapClient("wsdl", $options); 

這樣,你就不必檢查單元素或數組,但可以簡單地假設有一個數組。