如何知道一个数字是否属于PHP中的一个集合?

时间:2011-10-12 17:46:46

标签: php range belongs-to

我将举一个例子,它将更加直截了当:

我正在使用坐标,我想过滤掉不属于拾取坐标周围的坐标的坐标。这里以纬度为例:

$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?“

谢谢大家: - )

3 个答案:

答案 0 :(得分:4)

你能不能只测试

if (abs($lat - $latitude) <= 0.2) {
  echo $lat;
}

答案 1 :(得分:1)

除非我误解了某些事情,否则

if ( ($lat >= $latitude - 0.2) && ($lat <= $latitude + 0.2) )
    echo $lat;

应该有用。

答案 2 :(得分:0)

您可以使用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;
    }
}