2016-12-14 34 views
0

我正在使用澳大利亞郵政郵編loookup API,它會返回JSON響應。來自JSON的PHP數組如果只有一個結果,則不同

如果我要尋找的3094,它返回

Array 
(
    [localities] => Array 
     (
      [locality] => Array 
       (
        [category] => Delivery Area 
        [id] => 5588 
        [latitude] => -37.717549 
        [location] => MONTMORENCY 
        [longitude] => 145.121028 
        [postcode] => 3094 
        [state] => VIC 
       ) 

     ) 

) 

但是,如果我尋找的是有一個以上的郊區(位置)相關聯的郵政編碼,如3084,我得到

Array 
(
    [localities] => Array 
     (
      [locality] => Array 
       (
        [0] => Array 
         (
          [category] => Delivery Area 
          [id] => 5574 
          [latitude] => -37.739262 
          [location] => VIEWBANK 
          [longitude] => 145.096424 
          [postcode] => 3084 
          [state] => VIC 
         ) 

        [1] => Array 
         (
          [category] => Delivery Area 
          [id] => 5572 
          [latitude] => -37.756341 
          [location] => HEIDELBERG 
          [longitude] => 145.067145 
          [postcode] => 3084 
          [state] => VIC 
         ) 

        [2] => Array 
         (
          [category] => Delivery Area 
          [id] => 5573 
          [latitude] => -37.742893 
          [location] => ROSANNA 
          [longitude] => 145.065044 
          [postcode] => 3084 
          [state] => VIC 
         ) 

        [3] => Array 
         (
          [category] => Delivery Area 
          [id] => 5570 
          [latitude] => -37.7442195 
          [location] => BANYULE 
          [longitude] => 145.08793 
          [postcode] => 3084 
          [state] => VIC 
         ) 

        [4] => Array 
         (
          [category] => Delivery Area 
          [id] => 5571 
          [latitude] => -37.762519 
          [location] => EAGLEMONT 
          [longitude] => 145.068208 
          [postcode] => 3084 
          [state] => VIC 
         ) 

       ) 

     ) 

) 

現在,通過

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_URL, $api_search_url); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Auth-Key: ' . $authKey 
)); 

$response = curl_exec($ch); 
curl_close($ch); 
$json_dec = json_decode($response,true); 

解碼後,我可以做一個foreach循環就像

echo '<ul id="pcode_results" style="list-style:none;text-align:left;padding:10px;">'; 

foreach($json_dec['localities'] as $locality){ 
     echo '<li class="pcode_res" style="cursor:pointer;" id="' . $locality['postcode'] . ',' . $locality['location'] . ',' . $locality['state'] . '">' . $locality['postcode'] . ', ' . $locality['location'] . ', ' . $locality['state'] . '</li>'; 
    } 

echo '</ul>'; 

,它似乎工作時,有一個結果,如3094,而不是當有像3084

多個結果我本來就具有JSON解碼作爲一個對象數組,並做$ locality- >郵政編碼將工作,但只有當有超過1個結果。

我哪裏錯了?它需要能夠處理數組結構不同的兩種情況(1個結果或多於1個)。

謝謝。

回答

1

如果你看看結果集,你會發現一些細節,當只有一個選項可用時,api只返回一個地點,當有多個選項可用時,它返回一組地點。

當等級4返回多個時局部性細節它返回結果只有一個局部性細節在3級,但是。

if (isset($json_dec['localities']['locality']['category'])) { 
    // It means it returned a single result set, If details in Level 3 it is a single result 
    $locality = $json_dec['localities']['locality']; 
    echo '<li class="pcode_res" style="cursor:pointer;" id="' . $locality['postcode'] . ',' . $locality['location'] . ',' . $locality['state'] . '">' . $locality['postcode'] . ', ' . $locality['location'] . ', ' . $locality['state'] . '</li>'; 
} else { 
    foreach ($json_dec['localities']['locality'] as $locality) { 
     echo '<li class="pcode_res" style="cursor:pointer;" id="' . $locality['postcode'] . ',' . $locality['location'] . ',' . $locality['state'] . '">' . $locality['postcode'] . ', ' . $locality['location'] . ', ' . $locality['state'] . '</li>'; 
    } 
} 
+0

你先生(假設你是他)是個天才!這種方法完美。你的第二句話清楚地解釋了我在傳達問題時遇到的困難。 – RossS

0

請試試這個代碼:

foreach($json_dec['locality'] as $locality) 
{ 
    echo '<li class="pcode_res" style="cursor:pointer;" id="' . $locality['postcode'] . ',' . $locality['location'] . ',' . $locality['state'] . '">' . $locality['postcode'] . ', ' . $locality['location'] . ', ' . $locality['state'] . '</li>'; 
} 

謝謝...

+0

它不會滿足第一個條件。其次在$ json_dec中沒有'locality'索引。它在'地點'下,$ json_dec ['地點'] ['地點']; – DarkKnight

0

您可以使用is_array檢查其數組:

foreach($json_dec['localities']['locality'] as $key => $value){ 
    if (is_array($value)) { 
     foreach ($value as $locality) { 
      echo '<li class="pcode_res" style="cursor:pointer;" id="' . $locality['postcode'] . ',' . $locality['location'] . ',' . $locality['state'] . '">' . $locality['postcode'] . ', ' . $locality['location'] . ', ' . $locality['state'] . '</li>'; 
     } 
    } else { 
     echo '<li class="pcode_res" style="cursor:pointer;" id="' . $value['postcode'] . ',' . $value['location'] . ',' . $value['state'] . '">' . $value['postcode'] . ', ' . $value['location'] . ', ' . $value['state'] . '</li>'; 
    } 
} 
+0

這是兩個場景中的數組,呃? – Daerik

+0

@adrianp謝謝。它永遠不會回來作爲一個數組。我試過'is_array($ json_dec_arr ['localities'] ['locality'])',這兩種情況都回來了。是不是'地方'總是一個數組,但只取決於它是否包含數組或數據? $ json_dec_arr只是解碼爲數組,所以我知道它是否解碼爲對象或數組。 – RossS

+0

@Daerik和RossS你是對的,下次我會先測試我的答案!我要編輯我的答案 – adrianp

0

使用此代碼來訪問所有的數組元素:

foreach($json_dec['localities']['locality'] as $locality){ 

    echo '<li class="pcode_res" style="cursor:pointer;" id="' .$locality['postcode'] . ',' . $locality['location'] . ',' . $locality['state'] . '">' . $locality['postcode'] . ', ' . $locality['location'] . ', ' . $locality['state'] . '</li>'; 

} 
+0

t不會滿足第一個條件。 – DarkKnight

相關問題