Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, após três dias( e noites ) tentando exaustivamente, venho pedir a ajuda para conseguir montar todas as combinações possíveis e inseri-las no banco de dados.
Encontrei uma função muito bacana que faz isto com uma matriz, o link é:
Mas no meu caso os valores e nomes são todos dinâmicos vindos de formulários, por exemplo:
<input name="letra[]">
<input name="letra[]">
<input name="numero[]">
<input name="numero[]">
Neste caso por exemplo, o usuário digitaria duas letras e dois números e o sistema montaria todas as combinações possíveis e inseriria no banco de dados, mas não consigo montar a matriz dinâmica.
Desde já muito obrigado a atenção de todos.
Já estudou sobre permutação simples?
Quando formamos agrupamentos com m elementos, de forma que os m elementos sejam distintos entre si pela ordem. As permutações podem ser simples, com repetição ou circulares.
Permutação simples: São agrupamentos com todos os m elementos distintos.
Fórmula: Ps(m) = m!.
Cálculo para o exemplo: Ps(3) = 3!=6.
Exemplo: Seja C={A,B,C} e m=3.
As permutações simples desses 3 elementos são 6 agrupamentos que não podem ter a repetição de qualquer elemento em cada grupo mas podem aparecer na ordem trocada. Todos os agrupamentos estão no conjunto:
Ps={ABC,ACB,BAC,BCA,CAB,CBA}
Mas, e agora? Como transformar isso em um algoritmo que o computador (neste caso, PHP) entenda?
Fácil, veja:
<?php
/**
* @staticvar array $result Armazena as combinações
* @param array $array Os elementos para combinação
* @param int $limit A quantidade máxima de elementos para combinar
* @param int $key Variável auxiliar para gerar as combinações
* @return array
* @throws LengthException
*/
function permutations( array $array, $limit = 8, $key = 0 ) static $result;
$count = count( $array );
try
{
if( $count > $limit )
{
throw new LengthException( sprintf( 'Error!: Unable to generate permutations with more than %d values' , $limit ) );
}
if( $key == $count )
{
$result[ ] = $array;
}
else
{
for( $i = $key; $i < $count; $i++ )
{
list( $array[ $key ], $array[ $i ] ) = array( $array[ $i ], $array[ $key ] );
permutations( $array, $limit, $key + 1 );
}
}
return $result;
}
catch( LengthException $e )
{
echo $e->getMessage( );
}
}
echo '<pre>';
print_r( permutations( array( 'A' , 1 , 'B' ) ) );
?>Array
(
[0] => Array
(
[0] => A
[1] => 1
[2] => B
)
[1] => Array
(
[0] => A
[1] => B
[2] => 1
)
[2] => Array
(
[0] => 1
[1] => A
[2] => B
)
[3] => Array
(
[0] => 1
[1] => B
[2] => A
)
[4] => Array
(
[0] => B
[1] => A
[2] => 1
)
[5] => Array
(
[0] => B
[1] => 1
[2] => A
)
)Muito obrigado pelas respostas, estudei e tentei criar algo mais ainda nada.
Vou explicar melhor: Estou trabalhando em um sistema de opções de compra de uma loja virtual, onde para cada produto o administrador pode escolher as opções disponíveis, o administrador também pode escolher o número de valores para e de opções que vai mostrar.
Na prática será mais usado tipo:
<input name="cor[]"> value="branco">
<input name="cor[]"> value="preto">
<input name="cor[]"> value="amarelo">
<input name="tamanho[]"> value="pequeno">
<input name="tamanho[]"> value="grande">
<input name="marca[]"> value="marca1">
<input name="marca[]"> value="marca2">
e etc...
Ou seja, preciso montar todas as combinações entre os arrays e não pode repetir em outra ordem.
O código do link que passei faz isto perfeitamente, porém não consigo pegar os dados do form e colocar dentro da matriz de arrays que no código é:
$opcoes = array(
'Cor' => array( 'preto','branco','azul' ),
'Tamanho' => array( 'P','M','G' ),
'Marca' => array( 'Lenovo', 'Positivo' ),
);
A= Input1
B= Input2
1= Input3
2= Input4
A1
A2
B1
B2
1A
2A
1B
2B
AB
BA
12
21
Agora faz o codigo pra ele combinar esses valores, simples, é só logica
Se ainda nao entendeu, tenta fazer com dois numeros em vez de quatro que tu vai sacar
Se trata de um codigo EXTREMAMENTE SIMPLES, BASEADO SOMENTE NA LOGICA
Onde voce vai criar uma ROTINA
Para fazer é necessario começar pelo mais facil, com dois numeros, depois da rotina pronta, voce faz com 4 numeros, pois é mais extenca, se voce ainda nem conseguiu fazer, entao tenta pelo inicio em vez de ir direto ao final.