Alle möglichen Kombinationen mit festen Werten

Daywood

Grünschnabel
Hallo zusammen,

ich habe jetzt schon eine ganze weile gesucht und probiert, aber leider nichts gefunden. Es geht darum, dass ich aus einem Array:
PHP:
array(1, 2, 3);
alle möglichen Kombinationen, d.h. 123,231,312,132,321,213 erhalten will. Da habe ich jetzt rausgefunden, dass man dies rekursiv machen kann, was auch super funktioniert. Mein Problem ist jetzt aber, dass ich feste Werte festlegen möchte. Das heißt z.B., dass der zweite Wert nicht verändert werden kann. Das Array dafür hatte ich mir so vorgestellt:
PHP:
array(0, 1, 0);
Mögliche Kombinationen wären dann nur noch 123 und 321. Kann mir irgendwer einen Tip geben, wie ich das in eine Rekursion wie diese hier:
PHP:
function permutation( $chars, $length )
{
    if( $length < 2 OR !is_array( $chars ) OR empty( $chars ) )
    {
        return $chars;
    }
    $result = array();
    foreach( $chars as $key => $value )
    {
        $cChars = $chars;
        unset( $cChars[$key] );
        $sub = permutation( $cChars, $length - 1);
        foreach($sub as $subvalue)
        {
            $result[] = $value .' '.$subvalue;
        }
    }
    return $result;
}

$chars = array(1, 2, 3);
print_r(permutation($chars, 3));
Quelle: http://www.tutorials.de/forum/php/312604-moegliche-kombinationen-von-5-zeichen-erstellen.html
einfügen kann?

Vielen Dank schonmal!
 
Die Werte, die nicht änderbar sein sollen, werden (von mir/dem Benutzer) vorgegeben. Ich wollte also eine Funktion erstellen, welche als Array die Werte sowie die nicht änderbaren Stellen entgegennimmt und alle möglichen Kombinationen zurückgibt.
 
Wieder mal ein wneig Gehirnakrobatik. Meine Lösung ist sicher nicht perfekt, aber sie geht...

PHP:
$chars = array(1, 2, 3);
$blocked = array(0, 1, 0);

// array erstellen der die blokierten Werte enthaltet
// $map = array{[1] => 2}
$map =  array_filter(array_map(create_function('$b, $c', 'return $b == 1 ? $c : false;'), $blocked, $chars));

// Differenz mit dem Key (Position) ermitteln
// $ch = array{[0] => 1, [2] => 3}
$ch = array_diff_key($chars, $map);

// permutation ausführen
// $ch = array {[0] => "1 3", [1] => "3 1"}
$ch = permutation($ch, count($ch));

// Die Ausgabe in Array splitten
// array{[0]=>array{[0]=>"1", [1]=>"3"}, [1]=>array{[0]=>"3", [1]=>"1"}}
$ch = array_map(create_function('$c', 'return explode(" ", $c);'), $ch);

function combinePermutationWithMap(&$char, $key, $map){
    foreach ($map as $pos => $value){
        array_splice($char, $pos, 0, $value);                
    }
}

// Die Resultatarrays mit $map kombinieren
// array{[0]=>array{[0]=>"1", [1]=>2, [2]=>"3"}, [1]=>array{[0]=>"3", [1]=>2, [2]=>"1"}}
array_walk($ch, 'combinePermutationWithMap' , $map);

// Die Resultatarrays wieder in Strings wandeln
// $ch = array {[0] => "1 2 3", [1] => "3 2 1"}
$ch = array_map(create_function('$c', 'return implode(" ", $c);'), $ch);

var_dump($ch);
 
Zurück