我想做的是获取数组中一组给定键的所有可能的百分比值组合。到目前为止,这是我应该做的所有事情,最多可以进行5种组合:
<?php
namespace App\Http\Controllers;
class CalculateController extends Controller
{
protected $percentages = [];
protected $maxPercent = 5;
public function index()
{
$keys = ['key1' => 0, 'key2' => 0, 'key4' => 0, 'key4' => 0];
$percentKeys = [];
$arrayKeys = array_keys($keys);
foreach($keys as $key => $value) {
$keyPlacement = array_search($key, array_keys($keys));
while($keyPlacement >= 0){
$keys[$arrayKeys[$keyPlacement]] = 0;
$keys = $this->loop($keys, $arrayKeys[$keyPlacement]);
$keyPlacement = $keyPlacement - 1;
}
}
$this->percentages = array_unique($this->percentages, SORT_REGULAR);
print_r($this->percentages);
}
public function loop( $array, $key ){
for($i = 0 ; $i < $this->maxPercent + 1 ; $i++) {
$array[$key] = $i;
$this->percentages[] = $array;
}
return $array;
}
}
这是输出:
Array
(
[0] => Array
(
[key1] => 0
[key2] => 0
[key3] => 0
[key4] => 0
)
[1] => Array
(
[key1] => 1
[key2] => 0
[key3] => 0
[key4] => 0
)
[2] => Array
(
[key1] => 2
[key2] => 0
[key3] => 0
[key4] => 0
)
[3] => Array
(
[key1] => 3
[key2] => 0
[key3] => 0
[key4] => 0
)
[4] => Array
(
[key1] => 4
[key2] => 0
[key3] => 0
[key4] => 0
)
[5] => Array
(
[key1] => 5
[key2] => 0
[key3] => 0
[key4] => 0
)
[7] => Array
(
[key1] => 5
[key2] => 1
[key3] => 0
[key4] => 0
)
[8] => Array
(
[key1] => 5
[key2] => 2
[key3] => 0
[key4] => 0
)
[9] => Array
(
[key1] => 5
[key2] => 3
[key3] => 0
[key4] => 0
)
[10] => Array
(
[key1] => 5
[key2] => 4
[key3] => 0
[key4] => 0
)
[11] => Array
(
[key1] => 5
[key2] => 5
[key3] => 0
[key4] => 0
)
[12] => Array
(
[key1] => 0
[key2] => 5
[key3] => 0
[key4] => 0
)
[13] => Array
(
[key1] => 1
[key2] => 5
[key3] => 0
[key4] => 0
)
[14] => Array
(
[key1] => 2
[key2] => 5
[key3] => 0
[key4] => 0
)
[15] => Array
(
[key1] => 3
[key2] => 5
[key3] => 0
[key4] => 0
)
[16] => Array
(
[key1] => 4
[key2] => 5
[key3] => 0
[key4] => 0
)
[19] => Array
(
[key1] => 5
[key2] => 5
[key3] => 1
[key4] => 0
)
[20] => Array
(
[key1] => 5
[key2] => 5
[key3] => 2
[key4] => 0
)
[21] => Array
(
[key1] => 5
[key2] => 5
[key3] => 3
[key4] => 0
)
[22] => Array
(
[key1] => 5
[key2] => 5
[key3] => 4
[key4] => 0
)
[23] => Array
(
[key1] => 5
[key2] => 5
[key3] => 5
[key4] => 0
)
[24] => Array
(
[key1] => 5
[key2] => 0
[key3] => 5
[key4] => 0
)
[25] => Array
(
[key1] => 5
[key2] => 1
[key3] => 5
[key4] => 0
)
[26] => Array
(
[key1] => 5
[key2] => 2
[key3] => 5
[key4] => 0
)
[27] => Array
(
[key1] => 5
[key2] => 3
[key3] => 5
[key4] => 0
)
[28] => Array
(
[key1] => 5
[key2] => 4
[key3] => 5
[key4] => 0
)
[30] => Array
(
[key1] => 0
[key2] => 5
[key3] => 5
[key4] => 0
)
[31] => Array
(
[key1] => 1
[key2] => 5
[key3] => 5
[key4] => 0
)
[32] => Array
(
[key1] => 2
[key2] => 5
[key3] => 5
[key4] => 0
)
[33] => Array
(
[key1] => 3
[key2] => 5
[key3] => 5
[key4] => 0
)
[34] => Array
(
[key1] => 4
[key2] => 5
[key3] => 5
[key4] => 0
)
[37] => Array
(
[key1] => 5
[key2] => 5
[key3] => 5
[key4] => 1
)
[38] => Array
(
[key1] => 5
[key2] => 5
[key3] => 5
[key4] => 2
)
[39] => Array
(
[key1] => 5
[key2] => 5
[key3] => 5
[key4] => 3
)
[40] => Array
(
[key1] => 5
[key2] => 5
[key3] => 5
[key4] => 4
)
[41] => Array
(
[key1] => 5
[key2] => 5
[key3] => 5
[key4] => 5
)
[42] => Array
(
[key1] => 5
[key2] => 5
[key3] => 0
[key4] => 5
)
[43] => Array
(
[key1] => 5
[key2] => 5
[key3] => 1
[key4] => 5
)
[44] => Array
(
[key1] => 5
[key2] => 5
[key3] => 2
[key4] => 5
)
[45] => Array
(
[key1] => 5
[key2] => 5
[key3] => 3
[key4] => 5
)
[46] => Array
(
[key1] => 5
[key2] => 5
[key3] => 4
[key4] => 5
)
[48] => Array
(
[key1] => 5
[key2] => 0
[key3] => 5
[key4] => 5
)
[49] => Array
(
[key1] => 5
[key2] => 1
[key3] => 5
[key4] => 5
)
[50] => Array
(
[key1] => 5
[key2] => 2
[key3] => 5
[key4] => 5
)
[51] => Array
(
[key1] => 5
[key2] => 3
[key3] => 5
[key4] => 5
)
[52] => Array
(
[key1] => 5
[key2] => 4
[key3] => 5
[key4] => 5
)
[54] => Array
(
[key1] => 0
[key2] => 5
[key3] => 5
[key4] => 5
)
[55] => Array
(
[key1] => 1
[key2] => 5
[key3] => 5
[key4] => 5
)
[56] => Array
(
[key1] => 2
[key2] => 5
[key3] => 5
[key4] => 5
)
[57] => Array
(
[key1] => 3
[key2] => 5
[key3] => 5
[key4] => 5
)
[58] => Array
(
[key1] => 4
[key2] => 5
[key3] => 5
[key4] => 5
)
)
所以我很近,但还没到那儿。任何反馈表示赞赏。
如果我理解这个问题,则您有一个最大百分比(在您的情况下为5)和一定数量的键(在这种情况下为1 ... 4)。您想用所有整数百分比的所有可能值(包括零,包括最大值)填充这四个键,并允许重复。
因此,在这种情况下,从0 0 0 0到5 5 5 5。
在这种情况下,您可以pow($MaxPercentage+1, $keyNumber)
在结果中获得最多的值。给定从0到此最大数字的任何数字,其组合为
function nthCombo($idx, $keyNumber, $top) {
$result = array_fill(0, $keyNumber, 0);
$pos = 0;
while ($idx) {
$result[$pos++] = $idx % $top;
$idx = floor($idx / $top);
}
return $result;
}
因此,如果您希望所有百分比都在一起:
$maxPercentage = 5;
$keyNumber = 4;
$top = $maxPercentage + 1;
$combinations = pow($top, $keyNumber);
print $combinations . "\n";
for ($i = 0; $i < $combinations; $i++) {
$allcombi[] = nthCombo($i, $keyNumber, $top);
}
这也使您无需实际存储结果即可工作,您可以一次处理一个值。
(使用可以立即映射到命名键array_combine()
)
如果您有给定数量的百分比,但它们的步长不是简单的(例如11%,13%,22%,22.5%,27%,31%),或者它们是类似['foo'的字符串, 'bar','baz'],您仍然可以使用上面的方法。您只需要使用地图:
$percs = [ 11%, 13%, 22%, 22.5%, 27%, 31% ];
现在,当算法为您提供$ combo = [0,2,1,5]时,您会将每个数字(例如2)转换为$ percs [2],即22%:
$perc2 = array_map(
function($idx) use ($percs) {
return $percs[$idx];
},
$combo
);
并获得$ perc2 = [11%,22%,13%,31%]。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句