PHP Obtenir toutes les options de pourcentage possibles dans le tableau


Paul

Ce que j'essaie de faire, c'est d'obtenir toutes les combinaisons de valeurs de pourcentage possibles pour un ensemble donné de clés dans un tableau. Voici ce que j'ai jusqu'à présent, qui est censé faire toutes les combinaisons possibles jusqu'à 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;
    }

}

Ceci produit:

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
    )

)

Donc je suis proche mais pas tout à fait là. Tout commentaire est apprécié.

LSerni

Si je comprends la question, vous avez un pourcentage maximum (dans votre cas 5) et un certain nombre de touches (dans ce cas 1 ... 4). Vous voulez remplir ces quatre clés avec toutes les valeurs possibles de tous les pourcentages entiers, zéro inclus, jusqu'au maximum inclus, avec les répétitions autorisées.

Donc, dans ce cas de 0 0 0 0 à 5 5 5 5.

Dans ce cas, vous pouvez avoir au maximum des pow($MaxPercentage+1, $keyNumber)valeurs dans votre résultat. Étant donné n'importe quel nombre de 0 à ce nombre maximum, sa combinaison sera

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;
}

Donc, si vous voulez tous les pourcentages, tous ensemble:

$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);
}

Cela vous permet également de travailler sans avoir besoin de stocker le résultat, vous pouvez le traiter une valeur à la fois.

(Le mappage aux clés nommées est immédiat en utilisant array_combine())

pourcentages ou chaînes spécifiques

Si vous avez un nombre donné de pourcentages mais qu'ils ne sont pas dans une progression simple (par exemple 11%, 13%, 22%, 22,5%, 27%, 31%), ou peut-être que ce sont des chaînes comme ['foo', 'bar', 'baz'], vous pouvez toujours utiliser l'approche ci-dessus. Vous utilisez simplement une carte :

$percs = [ 11%, 13%, 22%, 22.5%, 27%, 31% ];

Maintenant, lorsque l'algorithme vous donne $ combo = [0, 2, 1, 5] vous traduisez chaque nombre, par exemple 2, en $ percs [2], soit 22%:

$perc2 = array_map(
    function($idx) use ($percs) { 
        return $percs[$idx]; 
    }, 
    $combo
);

et obtenez $ perc2 = [11%, 22%, 13%, 31%].

Articles connexes


javascript : renvoie toutes les paires possibles dans le tableau

Hamid Bakhtiari le titre explique tout d'une manière ou d'une autre, j'aimerais utiliser la méthode "Combinaison" des mathématiques, voici la page Wikipedia pour être clair: https://en.wikipedia.org/wiki/Combination J'ai déjà trouvé la solution avec deux boucl

Obtenir toutes les combinaisons de valeurs possibles

georgehere Je veux écrire un code qui montre toutes les possibilités de sorties. le code ci-dessous montre les combinaisons avec des variables qui n'ont pas de répétition donc pour l'itération de 2 il n'inclut pas ('yes', 'yes') or ('no', 'no'). Je veux ajoute