Получение данных из ответа json с помощью Yelp API - PullRequest
1 голос
/ 07 мая 2019

У меня есть интересная проблема, с которой мне нужна помощь.

У меня есть клиент, который использует API Yelp для получения 10 ближайших результатов к точке, используя широту и долготу. Запрос API объединяет «список» категорий вместе, а затем передает его на запрос в Yelp.

Примерно так:

 $categories = [ 'pharmacy', 'hospitals', 'firedepartments', 'policedepartments', 'parks', 'restaurants', 'grocery' ];

 $list = join($categories, ",");

Когда этот вызов сделан, Yelp, кажется, не возвращает все псевдонимы категории правильно. Но когда каждая категория вызывается отдельно, она возвращает право псевдонима категории.

Поэтому, когда я использую оператор foreach () для зацикливания категорий, вот так:

    foreach($categories as $k=>$v){

      $resulted = yelp_search($v, $range, $lat, $lon, $num);
      $resulted = json_decode($resulted, true);
      $result[] = array_merge($result, $resulted);
    }

Он добавит его в массив $ result. Но проблема в том, что он добавит только последнюю категорию в список, например, в данном случае «продуктовый». Поэтому, когда функция в javascript выбрана для «ближайшей», она будет показывать только значки продуктов на карте и в списке, а не все, что она возвращает.

Это проблема № 1, проблема № 2 это. В отображаемом списке, поскольку «категория» устанавливается как «ближайшая» к функции в javascript, я должен просмотреть и просмотреть категории в возвращенных данных json и проверить, соответствует ли оно чему-либо в списке.

как это

                    for (var i = 0; i < count; i++) {
                  var b = results[category]['businesses'][i];

                  if(category == "closest"){

                      ccount = b.categories.length;

                      for(var m = 0; m < ccount; m++){
                        console.log(b.categories[m]['alias']);

                        var alias = cats.includes(b.categories[m]['alias']);

                        if(alias){

                            var c = b.categories[m]['alias'];
                            break;

                        }
                        else{
                            var c = results[category]['category_name'];
                        }
                      }



                  update = update + '<tr><td role="button" class="td_menu" data-category="' + c + '" data-index="' + i + '"><img style="height: 20px; padding-right: 5px;" src="<?php echo get_template_directory_uri(); ?>/images/' + c + '.png"><span style="vertical-align: top;">' + b.name + 
                '</span></td><td></td><td>' + (b.distance * 0.00062137).toFixed(2) + '</td><td>mi</td></tr>\n';               

                  }
                  else{

                  update = update + '<tr><td role="button" class="td_menu" data-category="' + category + '" data-index="' + i + '"><img style="height: 20px; padding-right: 5px;" src="<?php echo get_template_directory_uri(); ?>/images/' + category + '.png"><span style="vertical-align: top;">' + b.name + 
                '</span></td><td></td><td>' + (b.distance * 0.00062137).toFixed(2) + '</td><td>mi</td></tr>\n';                   


                  }



                }

Кажется, что вся эта часть работает нормально, потому что она возвращает правильный псевдоним категории (или продуктовый), и значки в списке отображаются. Я подозреваю, что, как только я смогу решить, как решить проблему № 1, проблема № 2 решится сама собой.

Мне нужно некоторое руководство по этому вопросу, пожалуйста. Я потратил 2 дня, пытаясь понять это правильно и показывать правильные значки в списке, а также получать самые близкие данные, чтобы они содержали все псевдонимы в данных.

Любая помощь и понимание очень ценится!

Заранее спасибо.

1 Ответ

0 голосов
/ 08 мая 2019

Ответ Yelp содержит также метаданные, вы не можете просто объединить их: вы хотите объединить только предприятия:

$result = array();
foreach($categories as $k=>$v){
  $resulted = yelp_search($v, $range, $lat, $lon, $num);
  $resulted = json_decode($resulted, true);

  if(array_key_exists('businesses', $result))
    $result['businesses'] = array_merge($result['businesses'], $resulted['businesses']);
  else
    $result = $resulted ;
}

Обратите внимание, что метаданные неверны (например, total), возможно, вынужно обновить это тоже, если вам это нужно.Yelp всегда возвращает самые специфические ключевые слова, поэтому даже с «ресторанами» у вас будет «libanese» или «пицца», а не «рестораны».Если вам нужно это ключевое слово для отображения маркера, вы можете добавить его в список, если его там еще нет.

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

usort($result['businesses'], function ($a, $b){
    return $a['distance'] - $b['distance'] ;
});

Теперь у вас есть список предприятий разных категорий, причем ближайший всегда находится на первой позиции, независимо от того, к какой категории он относится.

...