2016-12-14 43 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