Pergunta

Estou usando a resposta aceita em essa questão. Como tenho os mesmos requisitos, preciso obter todas as combinações de uma matriz de comprimento variável com um número variável de elementos. No entanto, também preciso produzir todas as combinações que não usam todos os elementos da matriz, mas estão em ordem. Se isso faz sentido?

Então, se esta é a matriz:

$array = array(
    array('1', '2'),
    array('a', 'b', 'c'),
    array('x', 'y'),
);

Eu também quero que ele adicione como 1a, 1b, 1c, 2a, 2b, 2c. Mas não 1x ou 1y, porque perde o segundo elemento da matriz.

Não consigo descobrir como alterar a resposta para incluir isso.

Obrigado, psy

Foi útil?

Solução

Usando a abordagem de Josh Davis na resposta à pergunta vinculada:

    $array = array( array('1', '2'), 
                    array('a', 'b', 'c'), 
                    array('m', 'n'), 
                    array('x', 'y'));

    $result = array();
    $php = 'list($a' . implode(',$a', array_keys($array)) . ')=$array;';
    $close_brakets='';
    $r='';
    foreach($array as $k => $v)
    {
        $r .= '$v'.$k;
        $php.='foreach($a'.$k.' as $v'.$k.'){ $result[]="'.$r.'";';
        $close_brakets.="}";
    }

    $php .= $close_brakets;

    eval($php);

    print_r($result);

Dá -lhe as combinações desejadas

Outras dicas

Algo assim? A idéia é fazer um loop uma matriz e combinar com cada valor em outra matriz.

// Loop array[0].
for($i=0; $i<count($array[0]); $i++) {
    // Loop array[1]
    for($j=0; $j<count($array[1]); $j++) {
        echo $array[0][$i];
        echo $array[1][$j];
    }
}

Bem, pegando o código que eu estava usando originalmente, foi isso que eu inventei, apenas caso mais alguém esteja curioso

$patterns_array = array();

$php = '';
foreach ($patterns as $i = > $arr)
{
    $php .= 'foreach ($patterns[' . $i . '] as $k' . $i . ' => $v' . $i . '){';
    $tmp = array();
    for($ii=1; $ii<=$i; $ii++){
        $tmp[] = $ii; 
    }
    $php .= '$patterns_array[] = $v'.implode('."::".$v', $tmp).';';
}

$php .= '$patterns_array[] = $v' . implode('."::".$v', array_keys($patterns)) . ';' . str_repeat('}', count($patterns));

eval($php);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top