使用Yelp API从JSON响应中获取数据

时间:2019-05-07 17:57:39

标签: javascript php json yelp yelp-fusion-api

我有一个有趣的问题,需要帮助。

我有一个客户正在使用Yelp API使用纬度和经度获得最接近点的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就会解决。

请为此提供一些指导。我花了两天的时间来解决这个问题,并在列表中显示适当的图标,并获取最接近的数据,以便它确实包含数据中的所有别名。

非常感谢您的帮助和见解!

谢谢。

1 个答案:

答案 0 :(得分:0)

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”或“ pizza”而不是“ restaurants”。如果您需要此关键字来显示标记,可以将其添加到列表中(如果尚未存在的话)。

Yelp API返回到您所查看位置的距离:一旦有了整个集合,就可以按照递减的距离对整个数组进行排序:

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

现在您有了一个不同类别的企业列表,无论类别是什么,最接近的企业始终排在第一位。