LINUX.ORG.RU

[PHP] Поиск в массиве диапазонов

 


0

1

Имеется массив диапазонов:

<?php
 $diap_array[1] = array( 1,5 );
 $diap_array[2] = array( 5,6 );
 $diap_array[3] = array( 8,10 );
?> 
Каким образом получить номер диапазона, в который входит, к примеру $val = 3 ?



Последнее исправление: dshtdsht (всего исправлений: 1)

Может другую профессию попробуешь? Программирование не для тебя.

anonymous
()
Ответ на: комментарий от SOmni

ТС хочет специальную функцию все_сделать_афигенно($diap_array);

anonymous
()
Ответ на: комментарий от SOmni

> Ничё не понял, for и if в php уже отменили что ли?

Не отменяли, но это по времени будет долго. Приведены простые примеры, а вот если диапазонов будет несколько сотен тысяч от 11111111111 до 99999999999 и получить номера диапазонов нужно для ста тысяч значений.

dshtdsht
() автор топика
Ответ на: комментарий от dshtdsht

>а вот если диапазонов будет несколько сотен тысяч от 11111111111 до 99999999999 и получить номера диапазонов нужно для ста тысяч значений.

Дрова лучше рубить топором, а не ковырять пилочкой для ногтей.

KRoN73 ★★★★★
()

судя по всему вам надо обычный бинарный поиск по массиву диапазонов, но как это в PHP принято делать я не знаю

aho
()
Ответ на: комментарий от dshtdsht

> а вот если
Если диапазоны отсортированы, то вообще никаких проблем.

SOmni ★★
()
Ответ на: комментарий от aho

Бинарный знаю, но вот как его реализовать для множества диапазонов - увы, нет.

dshtdsht
() автор топика

почему-то подобные вопросы всплывают на ЛОРе регулярно, хотя решение в явном виде описано в том же Кормене. эффективная структура данных для поставленной задачи называется интервальное дерево, является частным случаем r-дерева

другое дело, что то, как ты будешь реализовывать это добро в PHP - уже твоя личная забота

jtootf ★★★★★
()
Ответ на: комментарий от KRoN73

> Дрова лучше рубить топором, а не ковырять пилочкой для ногтей. Вы поэтому свой фреймворк на «пилочке» сделали?

dshtdsht
() автор топика
Ответ на: комментарий от dshtdsht

>Вы поэтому свой фреймворк на «пилочке» сделали?

Нет. Просто я ногти полирую пилочкой, а не топором.

KRoN73 ★★★★★
()

Держи блеать!

<?php
 $diap_array[1] = array( 1,5 );
 $diap_array[2] = array( 5,6 );
 $diap_array[3] = array( 8,10 );

 $val = 5;
 $count = count($diap_array);
 for($i=0; $i<=$count; $i++){
  if($diap_array[$i][0] == $val){
   echo "val=".$val ." in the ".$i." range<br>";
   continue;
  }
  if($diap_array[$i][1] == $val){
   echo "val=".$val ." in the ".$i." range<br>";
   continue;
  }
  if($diap_array[$i][0] < $val && $diap_array[$i][1] > $val){
    echo "val=".$val ." in the ".$i." range<br>";
    continue;
  }
 }

?>
anonymous
()
Ответ на: комментарий от anonymous

Ну и где интервальные деревья? Или хотя бы просто бинарный поиск? Конкатенация эта вырвиглазная. continue опять же. Нет, ТС такое не примет!

SOmni ★★
()
function where($val, $ranges)
{
        foreach($ranges as $i => $range)
        {
                if($val < $range['high'] &&  $val >= $range['low']) return $i;
        }
        return null;
}
FractaIL
()
Ответ на: комментарий от anonymous

> if($diap_array[$i][0] < $val && $diap_array[$i][1] > $val){

А ещё есть такие штуки: => =<

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.