2016-03-03 6 views
6

Ich versuche, etwas mit Yelp API2Fehler mit Yelp API Ausgang

$response = json_decode($data); 

, die Daten in einem PHP-Objektformat zurück zu tun, die etwa wie folgt aussieht:

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 
        ) 

      ) 

Ich möchte Ausgang ein einige Ergebnisse mit Limit:

Die Ausgabe ist in Ordnung, aber ich bekomme auch immer die folgenden Fehler für jede ite Ration der Schleife und jeden Wert:

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 

Und ich habe auf eine solche Linie ist:

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

Was bin ich?

Antwort

0

Sie versuchen nur 10. Element erhalten von Array, zum Beispiel, 9 Elemente; Sie verlassen sich nicht auf die Ziel-Array-Größe, die kleiner als Ihr Limit sein kann.

Wenn ich begrenzte Menge von Datensätzen zu bekommen versuchten, würde ich ein Stück aus dem $response->businesses erhalten und führen foreach durch die Scheibe:

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

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

Die array_slice Funktion hat eine gute Eigenschaft: Wenn die $limit größer als Gesamtzahl der Array-Elemente (beginnend mit $offset, der zweite Parameter der Funktion) gibt es nur verfügbare Elemente zurück. Zum Beispiel, wenn Sie array_slice([1, 2, 3, 4], 0, 100) tun, gibt es [1, 2, 3, 4] - Limit ist 100, aber Array hat nur 4 Elemente, so dass sie alle zurückgegeben werden und keine Elemente werden zum Array beim Schneiden hinzugefügt.

Ein anderer Weg:

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

$counter = 0; 

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

    $counter++; 

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

Hier breche ich nur foreach Schleife, wenn Grenzwert erreicht ist. Und ich werde keine Fehler haben, wenn ich weniger als $limit Array-Elemente habe.

Ein weiterer Ansatz, der aus dem Code geerbt wird:

$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; 
} 

In jedem Fall sollten Sie sich auf die Größe des Arrays verlassen, weil es die Chancen weniger als $limit sein muss, die Sie zu einigen Fehlern führen.

+0

Warum überprüfen Sie es in jeder Schleife wenn (! array_key_exists ($ x, $ Anfrage-> Unternehmen)) {...? – itzmukeshy7

+0

@ itzmukeshy7 Umm ... Um sicherzustellen, dass '$ Anfrage-> Unternehmen [$ x]' existiert. :) Das liegt daran, dass 'for ($ x = 0; $ x <$ limit; $ x ++)' sich nicht auf die Größe '$ request-> businesses' verlässt. Also müssen wir sicherstellen, dass der Array-Schlüssel '$ x' existiert, deshalb hat das Array einen Wert unter diesem Index. –

+0

Aber warum machen wir es komplex, wenn wir es nur durch die Aktualisierung der $ Limit mit count ($ response-> Unternehmen) nach meiner Antwort – itzmukeshy7

0

mit diesem Stück Code Versuchen:

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

besagt, warum Sie hinzugefügt brechen if ($ r> $ limit); in foreach? Was hast du keine Alternative oder das ist die beste Praxis? – itzmukeshy7

+0

Mit tihs Implementation wenn $ response-> business weniger Daten als limit hat, hört es auf, das Array selbst zu durchlaufen. –

+0

Definitiv, warum wir in jeder Iteration eine zusätzliche Bedingung hinzufügen, wenn wir dasselbe mit einer einzigen Anweisung machen können; Sieh meine Antwort; :) – itzmukeshy7

0

Es sieht aus wie Ihr die Grenze auf 10 säumige jedoch nur 9 Objekte in der Ergebnismenge sein muss. Die Notice: Undefined offset: 10 sagt Ihnen, dass es keinen Index für 10 im $response->businesses Array gibt. Die Notice: Trying to get property of non-object teilt Ihnen mit, dass $response->businesses[10] Null ist, die keine Eigenschaften hat, die gelesen werden können.

Statt Hartcodierung Wert, versuchen Sie die Größe des Arrays zu lesen:

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

Was ist, wenn der Benutzer einen Wert größer als count ($ response-> business) für $ _POST ['displayLimit'] eingibt – itzmukeshy7

+0

Guter Punkt. könnte diese Anzahl ($ response-> businesses) durch min ersetzen ([count ($ response-> businesses), $ _POST ['displayLimit']]) –

0

Sie haben diese

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

eine weitere Bedingung hinzufügen, nachdem es

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

Eine weitere Sache, die für Schleifenbedingung

JETZT

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

NACH

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

gleich Check entfernen, weil wir von 0 nicht 1.