Как узнать, принадлежит ли число к набору в PHP? - PullRequest
0 голосов
/ 12 октября 2011

Я приведу пример, он будет более точным:

Я работаю с координатами и хочу отфильтровать координаты, которые не принадлежат набору, вокруг выбранной координаты.Вот для широты, например:

$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 ]

4 голосов
/ 12 октября 2011

Не могли бы вы просто проверить

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

?

1 голос
/ 12 октября 2011

Если я не понимаю что-то ужасно,

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

должно работать.

0 голосов
/ 12 октября 2011

Вы можете использовать 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;
    }
}
...