2013-01-11 75 views
0

我不知道这是否是正确的地方来问这个问题,但在这里它去 我主要在PHP工作,但任何语言的ans将做。缩小范围内的一组数字

我正在制作一个网站的标签云。像this

东西可以说,我有一个数字

array(54, 67, 68, 72, 98, 103, 112, 136, 169, 200, 201)

这个数字代表了多少次一个字已被搜查在网站的数组。

在标签云中,我想显示流行的关键字在一个更大的字体大小。 所以我想用这个数字作为链接的字体大小

所以我的问题是,我怎样才能减少这些数字相对于对方,使他们都发生在10至20的愤怒。哪里10和20将是标签的字体大小

我希望我已经清楚了。

+0

所以,你要的字体大小为10和20之间(含)? – Boundless

+0

听起来像简单的数学。如果54是最小的数字,你希望它是10,那么执行'10/54'来找出应用的因素。然后将该数组中的每个数字与该因子相乘。 –

+0

你也可以在math.stackexchange.com上试试这个。 – hafichuk

回答

3

这里是fiddle

<?php 

$values = array(54, 67, 68, 72, 98, 103, 112, 136, 169, 200, 201); 

$max = max($values); 
$min = min($values); 

$fontMin = 10; 
$fontMax = 20; 

$valueDiff = $max - $min; 
$fontDiff = $fontMax - $fontMin; 
$incrementEvery = round($valueDiff/$fontDiff); 

foreach ($values as $value) { 
    $actualFont = round(($value - $min)/$incrementEvery) + $fontMin; 
    echo "$value: $actualFont \n"; 
} 

结果:

54: 10 
67: 11 
68: 11 
72: 11 
98: 13 
103: 13 
112: 14 
136: 15 
169: 18 
200: 20 
201: 20 

一行程序是:

round(($value - $min)/round(($max - $min)/($fontMax - $fontMin))) + $fontMin; 
+0

谢谢!这工作完美无瑕。 +1的详细答案! :) – Krimson

+0

很高兴它适合你。 – hafichuk

1

您可以使用php函数sort()[http://php.net/manual/en/function.sort.php]对数组进行排序,以获得最高和最低数字之间的差异。例如,在你的列表中,201是最高的,54是最低的,给你的差异是147。因为你想要10和20之间的包含,你有10种不同的字体大小可以使用(或更多,如果你使用小数),所以你可以将147除以10以确定最少需要多少项,才能将字体大小增加1个点。

所以,54将是10点字体,68将是11点字体(54 + 14.7 = 68.7)。如果你想使用整数,只需使用PHP floor()。

希望这给你一个如何解决问题的好主意。