【问题标题】:Getting data from json response using Yelp API使用 Yelp API 从 json 响应中获取数据
【发布时间】:2019-09-25 10:38:32
【问题描述】:

我有一个客户正在使用 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 就是这个。在显示的列表中,因为 'category' 被设置为与 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 天的时间试图做到这一点并在列表中显示正确的图标,以及获取最接近的数据,以便它确实包含数据中的所有别名。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多