PHP将所有可能的百分比选项放入数组

保罗

我想做的是获取数组中一组给定键的所有可能的百分比值组合。到目前为止,这是我应该做的所有事情,最多可以进行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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章