簡體   English   中英

PHP 將所有可能的百分比選項放入數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM