我举个例子,这样会更直接:
我正在处理坐标,我想过滤不属于选定坐标周围的集合的坐标。这里是纬度,例如:
$latitude = 4.3999291;
基本上,我有一个纬度数组,$array_latitudes
,我想测试每一个,知道它们是否属于$latitude
附近的范围。
我已经做了什么:
$set = range($latitude-0.2, $latitude+0.2, 0.0000001);
foreach ($array_latitudes as $lat){
if (in_array($lat, $set)){
echo $lat;
}
}
所以问题是,你猜对了,关于性能…创建一个10^-7范围的值数组需要很长时间!
我的问题是:"有没有一种更简单、更有效的方法来返回$array_latitudes
中属于集合[$latitude
-0.2, $latitude
+0.2]的纬度,精度为10^-7 ?"
谢谢大家:-)
你就不能测试一下
if (abs($lat - $latitude) <= 0.2) {
echo $lat;
}
?
除非我误解了什么,
if ( ($lat >= $latitude - 0.2) && ($lat <= $latitude + 0.2) )
echo $lat;
。
您可以使用array_filter
将数组减少到您正在寻找的值。
class RangeFilter {
var $lowerBound = 0;
var $upperBound = 0;
function RangeFilter($lowerBound, $upperBound) {
$this->lowerBound = $lowerBound;
$this->upperBound = $upperBound;
}
function filter($value) {
return ($value <= $this->upperBound && $value >= $this->lowerBound);
}
}
$latitude = 4.3999291;
$filter = new RangeFilter($latitude - 0.2, $latitude + 0.2);
$filteredCoordinates = array_filter($coordinates, array($filter, 'filter'));
但实际上,如果你想简单一点:
$latitude = 4.3999291;
$lowerBound = $latitude - 0.2;
$upperBound = $latitude + 0.2;
$filteredCoordinates = array();
foreach ($coordinates as $coordinate) {
if ($coordinate <= $upperBound && $coordinate >= $lowerBound) {
$filteredCoordinates[] = $coordinate;
}
}