我使用以下代码来获取位置之间的距离。
<?php
function curl_request($sURL,$sQueryString=null)
{
$cURL=curl_init();
curl_setopt($cURL,CURLOPT_URL,$sURL.'?'.$sQueryString);
curl_setopt($cURL,CURLOPT_RETURNTRANSFER, TRUE);
$cResponse=trim(curl_exec($cURL));
curl_close($cURL);
return $cResponse;
}
$sResponse=curl_request('http://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=London&destinations=Southend-on-sea|Westcliff-on-sea|Leigh-on-sea|leeds&mode=driving&language=en&sensor=false');
$oJSON=json_decode($sResponse);
if ($oJSON->status=='OK')
$fDistanceInMiles=(float)preg_replace('/[^\d\.]/','',$oJSON->rows[0]->elements[0]->distance->text);
else
$fDistanceInMiles=0;
echo 'Distance in Miles: '.$fDistanceInMiles.PHP_EOL;
?>
-
这只会获得JSON响应中的第一个值:
$fDistanceInMiles=(float)preg_replace('/[^\d\.]/','',$oJSON->rows[0]->elements[0]->distance->text);
-
JSON看起来像这样:
{
"destination_addresses" : [
"Southend-on-Sea, UK",
"Westcliff-on-Sea, Southend-on-Sea, UK",
"Leigh-on-Sea SS9, UK",
"Leeds, UK"
],
"origin_addresses" : [ "London, UK" ],
"rows" : [
{
"elements" : [
{
"distance" : {
"text" : "42.0 mi",
"value" : 67669
},
"duration" : {
"text" : "1 hour 14 mins",
"value" : 4464
},
"status" : "OK"
},
{
"distance" : {
"text" : "42.7 mi",
"value" : 68723
},
"duration" : {
"text" : "1 hour 17 mins",
"value" : 4646
},
"status" : "OK"
},
{
"distance" : {
"text" : "40.1 mi",
"value" : 64508
},
"duration" : {
"text" : "1 hour 10 mins",
"value" : 4225
},
"status" : "OK"
},
{
"distance" : {
"text" : "195 mi",
"value" : 313043
},
"duration" : {
"text" : "3 hours 39 mins",
"value" : 13133
},
"status" : "OK"
}
]
}
],
"status" : "OK"
}
因此,当我运行我的代码时,我会在页面上打印出来:
Distance in Miles: 42
但我需要的是打印出最高的数字。所以它应该是这样的:
Distance in Miles: 195
有人可以就此提出建议吗?
提前致谢。
答案 0 :(得分:3)
使用var name = context.User.Identity.Name;
if(name != null && name != ""){
context.Succeed(requirement);
}
else {
context.Fail();
}
,您可以提取所有array_column()
数组,然后使用distance
作为关键字并text
作为值来构建查找:
value
然后只需计算$array = json_decode($json, true);
$dist = array_column(array_column($array['rows'][0]['elements'], 'distance'),
'value', 'text');
,找到它并输出密钥:
max()
答案 1 :(得分:1)
为此,您可以收集数组中的所有text
,(尝试使用array_column()
)键,然后使用max()
答案 2 :(得分:1)
以下是使用数组缩减的方法:
<?php
$json = '{
"destination_addresses" : [
"Southend-on-Sea, UK",
"Westcliff-on-Sea, Southend-on-Sea, UK",
"Leigh-on-Sea SS9, UK",
"Leeds, UK"
],
"origin_addresses" : [ "London, UK" ],
"rows" : [
{
"elements" : [
{
"distance" : {
"text" : "42.0 mi",
"value" : 67669
},
"duration" : {
"text" : "1 hour 14 mins",
"value" : 4464
},
"status" : "OK"
},
{
"distance" : {
"text" : "42.7 mi",
"value" : 68723
},
"duration" : {
"text" : "1 hour 17 mins",
"value" : 4646
},
"status" : "OK"
},
{
"distance" : {
"text" : "40.1 mi",
"value" : 64508
},
"duration" : {
"text" : "1 hour 10 mins",
"value" : 4225
},
"status" : "OK"
},
{
"distance" : {
"text" : "195 mi",
"value" : 313043
},
"duration" : {
"text" : "3 hours 39 mins",
"value" : 13133
},
"status" : "OK"
}
]
}
],
"status" : "OK"
}';
$maxDistance = array_reduce(json_decode($json, true)["rows"][0]["elements"], function($accumulator, $item){
return ($item['distance']['value'] > $accumulator) ? $item['distance']['value'] : $accumulator;
}, 0);
var_dump($maxDistance);
<强>收率:强>
INT(313043)
这里的代码相同,没有不必要的转换为对象:
$distance = array_reduce(json_decode($json)->rows[0]->elements,
function($accumulator, $item){
return ($item->distance->value > $accumulator) ? $item->distance->value : $accumulator;
}, 0);
如果您不想重新转换为里程,则可以改为对文本字段的浮点值进行缩小。
http://sandbox.onlinephpfunctions.com/code/37176c07b7fc46a713b275e2d3326444b970de1a
我的猜测是,如果你有一个大阵列,这是最有效的方法。
答案 3 :(得分:1)
我不知道这是否更简单,但试一试。
在屏幕上打印之前做这样的事情。
$lenght_elements=sizeof($oJSON->rows[0])
$array_elements=array();
for($i=0;$i<$lenght_elements;$i++){
$fDistanceInMiles=(float)preg_replace('/[^\d\.]/','',$oJSON->rows[0]->elements[$i]->distance->text);
array_push($array_elements,$fDistanceInMiles);
}
$max_value=max($array_elements);
echo echo 'Distance in Miles: '.$max_value; //this should print the highest value
注意:如果你也需要遍历行,你可以使用另一个循环,无论如何你都会得到你的结果。
答案 4 :(得分:1)
保持简单。
$#