PHP 中一系列位置之间的总距离
Total distance between series of locations in PHP
我已经在使用半正弦公式来计算两点之间的距离。
我现在要做的是计算一系列位置之间的距离。
1 -> 2 -> 3 -> 4
我已经能够像这样调用函数了
$travelled = 0;
foreach ($this->book->locations as $key => $location) {
$travelled += Book::getDistance($location, $this->book->locations[$key + 1]);
}
但显然我 运行 遇到了问题,当我在最后一个位置时,$locations[$key + 1]
是一个无效索引。我怀疑正确的方法是 reduce
locations
使用 carrys
到下一次执行的距离的函数,但我不知道如何将“下一个”项目传递给reduce 函数,比如....
$this->locations->reduce(function ($sum, $location) use ($nextLocation) {
return $sum + Book::getDistance($location, $nextLocation);
}, 0);
这是一个快速简单的解决方案,但您可以在 foreach 中放置一个 if 语句来阻止索引导致错误,例如:
$travelled = 0;
$numLocations = $this->book->locations->count();
foreach ($this->book->locations as $key => $location) {
if ($key === $numLocations - 1) {
break;
}
$travelled += Book::getDistance($location, $this->book->locations[$key + 1]);
}
我已经在使用半正弦公式来计算两点之间的距离。
我现在要做的是计算一系列位置之间的距离。
1 -> 2 -> 3 -> 4
我已经能够像这样调用函数了
$travelled = 0;
foreach ($this->book->locations as $key => $location) {
$travelled += Book::getDistance($location, $this->book->locations[$key + 1]);
}
但显然我 运行 遇到了问题,当我在最后一个位置时,$locations[$key + 1]
是一个无效索引。我怀疑正确的方法是 reduce
locations
使用 carrys
到下一次执行的距离的函数,但我不知道如何将“下一个”项目传递给reduce 函数,比如....
$this->locations->reduce(function ($sum, $location) use ($nextLocation) {
return $sum + Book::getDistance($location, $nextLocation);
}, 0);
这是一个快速简单的解决方案,但您可以在 foreach 中放置一个 if 语句来阻止索引导致错误,例如:
$travelled = 0;
$numLocations = $this->book->locations->count();
foreach ($this->book->locations as $key => $location) {
if ($key === $numLocations - 1) {
break;
}
$travelled += Book::getDistance($location, $this->book->locations[$key + 1]);
}