Dynamic Price Range - алгоритм

xamelyon

Новичок
Dynamic Price Range - алгоритм

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

function get_ranges($max, $min, $nr_ranges){

$i_step = ???;

$arr_vals[] = $min;
$val_to_filt = $min;

while($val_to_filt < $max){
$val_to_filt = $val_to_filt + (($val_to_filt/100)*$i_step);
$arr_vals[] = $val_to_filt;
}

return $arr_vals;
}
если вручную менять $i_step получаются хорошие диапазоны, но так не подходит.
к примеру:
1. $ 0.00 - $ 2.00
2. $ 3.00 - $ 5.00
3. $ 6.00 - $ 10.00

заранее благодарен.
 

xamelyon

Новичок
$i_step должен меняться в зависимости от min, max и nr_ranges
но какую формулу использовать понятии не имею.
вот примеры если менять i_step в ручную:
max 100 -> i_step = 35
max 200 -> i_step = 50
max 300 -> i_step = 55
max 1000 -> i_step = 10
max 2000 -> i_step = 20
max 3000 -> i_step = 26
max 10000 -> i_step = 53
max 20000 -> i_step = 60
max 30000 -> i_step = 67
 

zerkms

TDD infected
Команда форума
max 100 -> i_step = 35
max 200 -> i_step = 50
max 300 -> i_step = 55
max 1000 -> i_step = 10
max 2000 -> i_step = 20
max 3000 -> i_step = 26
max 10000 -> i_step = 53
max 20000 -> i_step = 60
max 30000 -> i_step = 67
если ты взял цифры с потолка - то вполне вероятно, что тут и зависимости никакой нет )))
 

xamelyon

Новичок
да, интуитивно пробовал по 2-3 варианта на каждый макс пока получал правильный список

-~{}~ 25.05.10 02:22:

я по этому и обратился, может кто-то посоветует идею по лучше

-~{}~ 25.05.10 02:23:

должна же быть формула.

-~{}~ 25.05.10 02:23:

по google ничего не могу найти
 

baev

‹°°¬•
Команда форума
пока получал правильный список
— чем определяется «правильность» списка?

Пока критерии «правильности» не опишете, задача так и останется неформализуемой.
 

xamelyon

Новичок
то что я сделал может быть не правильным.
к примеру при min=700, max=20000, nr_ranges=7, должен получится список:
0 - 70
701 - 1200
1201 - 2500
2501 - 4000
4001 - 6000
6001 - 8000
8001 - 20000
может посоветуете как правильно сделать.
 

baev

‹°°¬•
Команда форума
Ничего не понимаю.

xamelyon, откуда у Вас при «min=700» диапазон «0 - 70»?
 

baev

‹°°¬•
Команда форума
а ноль откуда?

И, вообще, Вы словами можете объяснить, что хотите получить в итоге? Вы же по какому-то «алгоритму» свои списки выводили.
 

xamelyon

Новичок
к примеру при min=70, max=20000, nr_ranges=8, должен получится array():
results = array(70, 700, 1200, 2500, 4000, 6000, 8000, 20000);
 

AmdY

Пью пиво
Команда форума
вот оно - отсутствие абстрактного мышления.
 

baev

‹°°¬•
Команда форума
xamelyon:
Почему именно такой?
По какому «алгоритму» Вы его вывели?
 

fixxxer

К.О.
Партнер клуба
Автор оригинала: xamelyon
к примеру при min=70, max=20000, nr_ranges=8, должен получится array():
results = array(70, 700, 1200, 2500, 4000, 6000, 8000, 20000);
PHP:
if ($min == 70 && $max ==  20000 && $nr_ranges == 8) {
   $results = array(70, 700, 1200, 2500, 4000, 6000, 8000, 20000);
}
 

xamelyon

Новичок
временно я поставил такой алгоритм:
<?php
$i_min = 500;
$i_max = 20000;
$nr_ranges = 7;

$i_step = round(($i_max-$i_min)/$nr_ranges);
if(!$i_step>0) $i_step = 1;

if($i_min>0) $arr_vals[] = $i_min;
$val_to_filt = $i_min;

while($val_to_filt < $i_max){
$val_to_filt = $val_to_filt + $i_step;
$arr_vals[] = $val_to_filt;
if($val_to_filt > $i_max) break;
}

$arr_vals = array_unique($arr_vals);
echo "<pre>";
print_r($arr_vals);
?>
--------------------------------------------------------------------
Array
(
[0] => 500
[1] => 3286
[2] => 6072
[3] => 8858
[4] => 11644
[5] => 14430
[6] => 17216
[7] => 20002
)
---------------------------------------------------------------------
но так не нормально, логичный и удобный для пользователей вывод такой должен быть:
Array
(
[0] => 500
[1] => 1000
[2] => 2000
[3] => 4000
[4] => 8000
[5] => 12000
[6] => 16000
[7] => 20000
)
----------------------------------------------------------------------
при помощи этой функции я создаю фильтр по цены от минимальной до максимальной.
 
Сверху