Forum Webscript.Ru
Программирование => PHP => Тема начата: Сергей Иванов от 12 Июля 2006, 07:45:41
-
Блин, уже второй день маюсь по поводу решения своей задачи - всё получаются какие-то кодо-монстры, которые и меня даже пугают.
В общем моему пхп-скрипту надо как-то распознать какой наименьший разряд числа используется в колонке чисел. Мне это надо, чтобы потом нарисовать на этой основе график - точка должна соответствовать этой минимальной цифре, минимальному разряду.
примеры.
1. если в колонке 1.0950, 1.0800, 1.1000, 1.0010 ... то минимальный разряд 0.001
2. если к волонке 500000, 1300000, 900000, ... то минимальный разряд 100000
3. если в колонке 50000, 1.035, 10000000, 1.05289, ... то минимальный разряд 0.00001 (хотя этот пример для любителей выращивателей апачи и IE - мегов до 600 можно вырастить запросто :).
Братва, если кто сталкивался с решением - подскажите на милость.
-
Может так? (Не слишком "красивое" решение - но работает)
$a1=array(1.0950, 1.0800, 1.1000, 1.0010);
$a2=array(500000, 1300000, 900000);
$a3=array(50000, 1.035, 10000000, 1.05289);
echo FindMin($a1)."
";
echo FindMin($a2)."
";
echo FindMin($a3)."
";
//*** Выбор наименьшего из всех минимальных***
function FindMin($arr)
{
$min=FindMinNumber($arr[0]);
foreach($arr as $k=>$v)
{
$tmp=FindMinNumber($v);
if($tmp<$min) $min=$tmp;
}
return $min;
}
//***Нахождение минимального разряда одного числа***
function FindMinNumber($arr)
{
$tmp=explode(".",$arr);
if(isset($tmp[1]))
{
if(intval($tmp[1])>0) return FindMinFract($tmp[1]);
}
if(isset($tmp[0]))
{
if(intval($tmp[0])>0) return FindMinInt($tmp[0]);
}
return false;
}
//***Минимальный разряд дробной части***
function FindMinFract($arr)
{
$tmp=(-1)*strlen($arr);
return pow(10, $tmp);
}
//***Минимальный разряд целой части***
function FindMinInt($arr)
{
$count=1;
while(1)
{
$tmp= floatval($arr/10);
if($tmp==floatval(intval($tmp)))
{
$arr=$tmp;
$count++;
}
else
{
return pow(10, ($count-1));
}
}
}
?>
-
у меня подобная бодяжка получилась. я думал может есть вариант, типа:
$rate=puper(min($ar));
:)
Anyway thanX for help, Man!
-
Специально для любителей японской кухни посвещается:
$a1=array(1.0950, 1.0800, 1.1000, 1.0010);
$a2=array(500000, 1300000, 900000);
$a3=array(50000, 1.035, 10000000, 1.05289);
эхо(fract($a1), fract($a2), fract($a3));
function fract($a)
{
$t=explode(".",min($a));
if(isset($t[1]) && $t[1]>0)return strlen($t[1]);
if($t[0]>0)return -1*(strlen($t[0])-strlen(trim($t[0],"0")));
return 0;
}
Egorsha, thanks for help, again.
-
Вот в этом месте не правильно работает твоя функция.
...
$t=explode(".",min($a));
...
Хотя бы взять массив $a3, число 1.035 - минимальное, а "минимальный разряд" у числа 1.05289.
А если у минимального числа вообще нет дробной части?
типа так:
$a1=array(1, 1.0950, 1.0800, 1.1000, 1.0010);
- тогда граффик точно не построишь.
-
Профессор, могу я пересдать?
$a=array("11.5", "0", "1005", "105009");
echo fract($a);
function fract($a)
{
$m=$c=substr_count(implode("f",$a), ".")>0?0:500;
foreach($a as $v)
{
$e=explode(".", $v);;
if($c==0 && isset($e[1]) && $mif($c && $m>strlen($e[0]))$m=-1*strlen($e[0]);
}
return $m;
}
PS. тот фракт тоже работает для данных, которые поставляются не в обрезанном виде. например котировки акций. но настоящие кодеры любители японской кухни (КЛЯКи :) обязаны писать код на все случаи мозговых порывов леммингов юзающих наш софт. А посему проверяйте, Профессор, зачётка у меня с собой, вернее рядом с именем. :)