Ошибки с выходом Yelp API

Я пытаюсь сделать что-то с Yelp API2

$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++) {

}

Вывод просто отлично, но я также продолжаю получать следующие ошибки для каждой итерации цикла и каждого значения:

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;

Что мне не хватает?

6

Решение

Вы пытаетесь получить 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

Другие решения

Похоже, вы установили ограничение по умолчанию на 10, однако в наборе результатов должно быть только 9 объектов. Notice: Undefined offset: 10 говорит вам, что нет индекса для 10 в $response->businesses массив. 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

У вас есть это

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

Добавьте еще одно условие после него

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

Еще одна вещь для условия цикла

СЕЙЧАС

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

ПОСЛЕ

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

Удалите равную проверку, потому что мы заявляем от 0, а не от 1.

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
По вопросам рекламы [email protected]