[英]PHP Get all possible percentage options into array
我想要做的是为数组中给定的一组键获取所有可能的百分比值组合。 这是我到目前为止所拥有的,它应该做所有可能的组合,最多 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)。 您想用所有 integer 百分比的所有可能值填充这四个键,包括零,直到包括最大值,允许重复。
所以在这种情况下,从 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' ],你仍然可以使用上面的方法。 您只需使用map :
$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% ]。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.