2016-03-03 36 views
6

我試圖做一些與Yelp的API2錯誤與Yelp的API輸出

$response = json_decode($data); 

這在PHP對象格式看起來是這樣的返回數據:

stdClass Object 
(
[region] => stdClass Object 
    (
     [span] => stdClass Object 
      (
       [latitude_delta] => 0.28083237848028 
       [longitude_delta] => 0.23501544732261 
      ) 

     [center] => stdClass Object 
      (
       [latitude] => 31.335313781127 
       [longitude] => -92.786144296672 
      ) 

    ) 

[total] => 736 
[businesses] => Array 
    (
     [0] => stdClass Object 
      (
       [is_claimed] => 1 
       [rating] => 4 
       [mobile_url] => http://m.yelp.com/bizzzz?utm_campaign=yelp_api&utm_medium=api_v2_search&utm_source=toQu_qgvu90-Z7dQuZOWMQ 
       [rating_img_url] => https://s3-media4.fl.yelpcdn.com/assets/2/www/img/c2f3dd9799a5/ico/stars/v1/stars_4.png 
       [review_count] => 147 
       [name] => Name here 
       [rating_img_url_small] => https://s3-media4.fl.yelpcdn.com/assets/2/www/img/f62a5be2f902/ico/stars/v1/stars_small_4.png 
       [url] => http://www.yelp.com/biz/zzz?utm_campaign=yelp_api&utm_medium=api_v2_search&utm_source=toQu_qgvu90-Z7dQuZOWMQ 
       [categories] => Array 
        (
         [0] => Array 
          (
           [0] => Chinese 
           [1] => chinese 
          ) 
        ) 

       [phone] => 5123355555 
       [snippet_text] => My family and I went to HAO-Q Asian Kitchen for the first time before a performance of our children in Aladdin. We all happen really love Asian cuisine.... 
       [image_url] => https://s3-media3.fl.yelpcdn.com/bphoto/XS5NjGCdn3s14_efs9w5rw/ms.jpg 
       [snippet_image_url] => http://s3-media4.fl.yelpcdn.com/photo/ZxVY3kdLGl6AyAblYbIRgQ/ms.jpg 
       [display_phone] => +1-512-338-5555 
       [rating_img_url_large] => https://s3-media2.fl.yelpcdn.com/assets/2/www/img/ccf2b76faa2c/ico/stars/v1/stars_large_4.png 
       [id] => kitchen-austin 
       [is_closed] => 
       [location] => stdClass Object 
        (
         [city] => Austin 
         [display_address] => Array 
          (
           [0] => 123 Street 
           [1] => Ste 113 
           [2] => Far West 
           [3] => Austin, TX 78731 
          ) 

         [geo_accuracy] => 8 
         [neighborhoods] => Array 
          (
           [0] => Far West/Northwest Hills 
          ) 

         [postal_code] => 78731 
         [country_code] => US 
         [address] => Array 
          (
           [0] => 3742 Far W Blvd 
           [1] => Ste 113 
          ) 

         [coordinate] => stdClass Object 
          (
           [latitude] => 31.356237 
           [longitude] => -92.758041 
          ) 

         [state_code] => TX 
        ) 

      ) 

我想輸出幾個結果使用限制:

$limit = (isset($_POST['displayLimit']) ? $_POST['displayLimit'] : 10); 

for ($x = 0; $x <= $limit; $x++) { 

} 

輸出是蠻好的,但我也不斷收到以下錯誤每個ITE循環和每一個值的比:

Notice: Undefined offset: 10 in /mypath/YelpTest.php on line 94 Notice: Trying to get property of non-object in /mypath/YelpTest.php on line 94 

而且我有這樣的路線是:

echo $response->businesses[$x]->name; 

我缺少什麼?

回答

0

你正試圖從只有陣列,例如得到10元,9元;你不依賴於目標數組的大小,這可能比你的限制更小。

如果我想獲得的記錄量有限,我會從$response->businesses得到一個片,並通過切片進行foreach

$limit = isset($_POST['displayLimit']) ? $_POST['displayLimit'] : 10; 

foreach (array_slice($response->businesses, 0, $limit) as $business) { 
    echo $business->name; 
} 

array_slice功能有一個很好的功能:當$limit較大數組元素的總數(從$offset開始,即函數的第二個參數),它只返回可用的元素。例如,如果您執行array_slice([1, 2, 3, 4], 0, 100),則返回[1, 2, 3, 4] - 限制爲100,但數組只有4個元素,因此它們全部返回,並且在切片時沒有任何元素添加到數組。

另一種方式:

$limit = isset($_POST['displayLimit']) ? $_POST['displayLimit'] : 10; 

$counter = 0; 

foreach ($response->businesses as $business) { 
    echo $business->name; 

    $counter++; 

    if ($counter >= $limit) { 
     break; 
    } 
} 

在這裏,我剛剛突破foreach循環達到極限時。當我有小於$limit數組元素時,我將沒有錯誤。

這是從你的代碼繼承了另一種方法:

$limit = isset($_POST['displayLimit']) ? $_POST['displayLimit'] : 10; 

for ($x = 0; $x < $limit; $x++) { 
    if (!array_key_exists($x, $request->businesses)) { 
     // We have reached the end of $request->businesses array, 
     // so break "for" loop. 
     break; 
    } 

    echo $business->name; 
} 

在任何情況下,你應該依賴於數組的大小,因爲它有機會是較少比$limit,這將導致你的一些錯誤。

+0

爲什麼你在每一個循環中檢查它(if(!array_key_exists($ x, $ request-> business)){...? – itzmukeshy7

+0

@ itzmukeshy7嗯...要確保'$ request-> business [$ x]'存在。 :)這是因爲for($ x = 0; $ x <$ limit; $ x ++)'完全不依賴'$ request-> business'的大小。所以,我們需要確保數組鍵'$ x'是否存在,因此array在該索引下有一個值。 –

+0

但是,爲什麼我們可以通過按照我的答案 – itzmukeshy7

0

嘗試使用這段代碼:

foreach($response->businesses as $key=>$r) 
{ 
if($key>$limit) break; 
echo $r->name //May need to do some var_dumps in order to see what you get 
} 
+0

爲什麼你添加如果($ R> $限制)分手聲明;在foreach?你沒有其他選擇,或者這是最佳做法? – itzmukeshy7

+0

使用tihs如果$ response-> business的數據少於限制,它將停止遍歷數組。 –

+0

當然,爲什麼我們在每次迭代中增加一個額外的條件,如果我們可以對單個語句做同樣的處理;看到我的答案; :) – itzmukeshy7

0

它看起來像你的拖欠限制10但有一定只能在結果集9級的對象。 Notice: Undefined offset: 10告訴你在$response->businesses陣列中沒有10的索引。 Notice: Trying to get property of non-object告訴你$response->businesses[10]爲空,它沒有任何可讀的屬性。

而不是硬編碼值,嘗試讀取數組的大小:

$limit = (isset($_POST['displayLimit']) ? $_POST['displayLimit'] : count($response->businesses); 
for ($x = 0; $x <= $limit; $x++) { 
    ... 
+0

如果用戶爲$ _POST ['displayLimit'] – itzmukeshy7

+0

輸入大於count($ response-> business)的值,​​那該怎麼辦?好點。可以用min([count($ response-> business),$ _POST ['displayLimit']])來替換這個計數($ response-> business) –

0

你有這樣的

$limit = (isset($_POST['displayLimit']) ? $_POST['displayLimit'] : 10); 

添加一個條件後

$returnedBusinesses = count($response->businesses); 
$limit = (($limit > $returnedBusinesses)?$returnedBusinesses:$limit); 

一件事for循環條件

NOW

for ($x = 0; $x <= $limit; $x++) { 

for ($x = 0; $x < $limit; $x++) { 

刪除等於檢查,因爲我們是從0而不是1