[PHP] Alle möglichen Kombinationen eines 2D-Arrays

spectrumizer

Moderator
Teammitglied
Mitglied seit
13.07.2006
Beiträge
8.555
Reaktionspunkte
394
Kommentare
87
Buffs erhalten
26
Hey,
 
ich hock hier jetzt schon seit einigen Stunden und komme einfach auf keinen grünen Zweig, bzw. nicht so richtig.
 
Gegeben ist ein Array:
Code:
            [rahmenfarbe] => Array
                (

                    [0] => Graphite

                    [1] => Aluminium

                    [2] => Smoke

                )
            [rueckenunterstuetzung] => Array

                (

                    [0] => PostureFit

                    [1] => Test

                )
            [armauflagen] => Array

                (

                    [0] => Leder

                    [1] => Vinyl

                )
            [rollen] => Array

                (

                    [0] => Teppichrollen

                    [1] => Hartbodenrollen

                )
 
 
Daraus soll ein Array erstellt werden, was ALLE möglichen Kombinationen aus den obenstehenden Optionen enthält und etwa so aussieht:
Code:
            [0] => Array
                (

                    [rahmenfarbe] => Graphite

                    [rueckenunterstuetzung] => PostureFit

                    [armauflagen] => Leder

                    [rollen] => Teppichrollen

                )
            [1] => Array

                (

                    [rahmenfarbe] => Aluminium

                    [rueckenunterstuetzung] => PostureFit

                    [armauflagen] => Leder

                    [rollen] => Teppichrollen

                )
            [2] => Array

                (

                    [rahmenfarbe] => Smoke

                    [rueckenunterstuetzung] => PostureFit

                    [armauflagen] => Leder

                    [rollen] => Teppichrollen

                )
            [3] => Array

                (

                    [rahmenfarbe] => Graphite

                    [rueckenunterstuetzung] => Test

                    [armauflagen] => Leder

                    [rollen] => Teppichrollen

                )
            [4] => Array

                (

                    [rahmenfarbe] => Aluminium

                    [rueckenunterstuetzung] => Test

                    [armauflagen] => Leder

                    [rollen] => Teppichrollen

                )
            [5] => Array

                (

                    [rahmenfarbe] => Smoke

                    [rueckenunterstuetzung] => Test

                    [armauflagen] => Leder

                    [rollen] => Teppichrollen

                )
            [6] => Array

                (

                    [rahmenfarbe] => Graphite

                    [rueckenunterstuetzung] => PostureFit

                    [armauflagen] => Vinyl

                    [rollen] => Teppichrollen

                )
// ... usw
Das ist der Code den ich bisher habe:
Code:
            $template = "test";
            $maxCombinations = 0;
            $optionKeys = array_keys($options);
            foreach($optionKeys as $index => $optionKey) {
                $indexCounters[$optionKey] = 0;
                $maxCombinations += count($options[$optionKey]);
            }
            $maxCombinations *= count($options);
            echo "Max: {$maxCombinations}\n\n";
            
            $i1 = 0;
            $i2 = 0;
            while (true) {
                echo str_repeat("-", 80) . "\n";
                print_r($indexCounters);
                echo str_repeat("-", 80) . "\n";
                foreach ($optionKeys as $optionKey) {
                    $matrix[$template][$combinationsCount][$optionKey] = $options[$optionKey][$indexCounters[$optionKey]];
                    echo "matrix[\"{$template}\"][\"{$combinationsCount}\"][\"{$optionKey}\"] = options[\"{$optionKey}\"][\"{$indexCounters[$optionKey]}\"] ({$options[$optionKey][$indexCounters[$optionKey]]})\n";
                }
                $combinationsCount++;
                echo str_repeat("-", 80) . "\n";

                $indexCounters[$optionKeys[$i1]]++;
                if ($indexCounters[$optionKeys[$i1]] >= count($options[$optionKeys[$i1]])) {
                    $i1 = 0;
                    $i2++;
                    if ($i2 >= count($options))
                        break;
                    for ($a = 0; $a < $i2; $a++)
                        $indexCounters[$optionKeys[$a]] = 0;
                    $indexCounters[$optionKeys[$i2]]++;
                }
            }

            print_r($matrix);
Prinzipiell funktioniert das auch. Er erstellt nur nicht alle möglichen Kombinationen (nur 11 von 36). Ich denke, das hängt wohl noch mit den Zählern zusammen ($i1, $i2, ...). Das sehe ich auch an der Debug-Ausgabe. Ich glaube die müssten auch verschachtelt werden ... Aber uff, ich glotz da heute schon zu lange drauf. Vielleicht hat einer von euch noch 'n Gedankenblitz? :D
 
Achso @ZAM, ich hab jetzt mal wieder PHPStorm im Einsatz. Erstmal die Trial. Lässt sich echt sehr angenehm mit arbeiten bisher. Ist auch deutlich flotter als NetBeans ... und auch als "NuSphere PhpEd", was bisher sonst mein alternativer Favorit war.
 
Zuletzt bearbeitet von einem Moderator:
Zurück