2012-07-23 81 views
1

只是说我要带数字阵列:如何制作适合范围的整数数组?

$a['a'] = 10; 
$a['b'] = 20; 
$a['c'] = 500; 
$a['d'] = 1000; 

,并强迫他们适应范围内(例如1〜100),像这样:

$a['a'] = 1; 
$a['b'] = 2; 
$a['c'] = 50; 
$a['d'] = 100; 

另一个例子......

来源:

$a['a'] = 12; 
$a['b'] = 28; 

要:

$a['a'] = 1; 
$a['b'] = 100; 

什么是最好的方式去呢?

+2

对于迄今为止的尝试,您觉得什么不够理想? :-) – azhrei 2012-07-23 06:09:21

+1

您需要2次通过数组 - 一次找到最大和最小数字,第二次通过数字归一化。 – nhahtdh 2012-07-23 06:09:51

+0

更清晰:希望保持数字之间的分配比例相同。 – user217562 2012-07-23 06:20:41

回答

7

更新:

现在我明白你真正想要的东西,你需要使用这个公式:

 (new_max - new_min)(x - min) 
f(x) = ---------------------------- + new_min 
       max - min 

如:

$a = [ 
    'a' => 10, 
    'b' => 20, 
    'c' => 500, 
    'd' => 1000, 
]; 
$min = min($a); 
$max = max($a); 
$new_min = 1; 
$new_max = 100; 
foreach ($a as $i => $v) { 
    $a[$i] = ((($new_max - $new_min) * ($v - $min))/($max - $min)) + $new_min; 
} 
var_dump($a); 

例子:http://codepad.viper-7.com/hwGnhJ


老答案:

您可以使用array_walk,和min/max为:

$a = [1, 2, 1000]; 
array_walk($a, function(&$value) { 
    $value = max(min($value, 100), 1); 
}); 
var_dump($a); 

例子:http://codepad.viper-7.com/jjOCjx

或者只是一个简单的foreachif

foreach ($a as $i => $v) { 
    if ($v > 100) $a[$i] = 100; 
    elseif ($v < 1) $a[$i] = 1; 
} 
+1

也加上'max(lower_bound,$ value)',因为OP要求的是范围,而不仅仅是upper_bound。 – azhrei 2012-07-23 06:12:34

+0

不是什么要求。数字应该具有相同的分布,而不是简单地被封顶。 – deceze 2012-07-23 06:14:15

+0

@deceze那也是!但是现在你看到了你提问的方式的局限性。它太简短,没有描述你想要什么,你尝试过什么,这很容易被误读。 :-) – azhrei 2012-07-23 06:17:18

0

嗨,你可以在下面的方式做到这一点。

$a['a'] = 10; 
$a['b'] = 20; 
$a['c'] = 500; 
$a['d'] = 1000; 

$range =10; // you can define the range here which you want. 


foreach($a as $k=>$v) 
{ 

    $a[$k] = $v/$range; 

} 

print_r($a);