我有一个有趣的问题,需要帮助。
我有一个客户正在使用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就会解决。
请为此提供一些指导。我花了两天的时间来解决这个问题,并在列表中显示适当的图标,并获取最接近的数据,以便它确实包含数据中的所有别名。
非常感谢您的帮助和见解!
谢谢。
答案 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'] ;
});
现在您有了一个不同类别的企业列表,无论类别是什么,最接近的企业始终排在第一位。