Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde Pessoal, peguei um trabalho para fazer e falta apenas um detalhe que já quebrei a cabeça.
No meu banco eu cadastro todos os laçadores de cabeça e os laçadores de pez em 2 tabelas distintas:
create table lacadores (
id_lacador int(11) not null auto_increment,
id_evento int(11) default null,
nome varchar(255) default null,
valor float(9,2) default null,
primary key(id_lacador)
);
create table pezeros ();
Apos o cadastro todos os laçadores tem que correr "LAÇAR UM BOI" com todos os pezeros. Então criei 2 tabelas para gerar como se fosse as rodadas. O problema que nem pezero nem laçador pode correr mais de uma vez em cada rodada.
create table bolao ();
create table bolao_cruzamentos();
Fiz de uma maneira aqui puxando pelo while todos cadastros de laçadores e fazendo a rodada de cada laçador gravando com cada pezero.
O problema e que na primeira rodada todos os laçadores corre com o mesmo pezero.
Como eu faria para fazer corretamente a inserção na tabela?Eu tinha pensado pela forma dos 2 whiles nem me atentei a criar um campo onde 1 poderia ser cabeceiro e 2 pezeiro mais creio que de ambas as formas minha duvida seguira a mesma como fazer para criar a rodada de uma maneira que um cabeceiro e um pezeiro so corra uma vez por rodada
tu pode ter uma tbRodadas e nela meteres os dados da rodada tipo id, data, hora, numero(se for o caso) e demais detalhes concernente a rodada. eu não faço ideia de como funciona essas parada aí de rodeio e tals mas a ideia geral é cada tabela ter somente os dados referentes ao que ela vai guardar. tabela de rodada só com dados da rodada. aí acho que vai precisar de uma outra tabela tbRodadaDetalhes para os detalhes da rodada tipo id da rodada na tbRodadas, id de quem correu, pontuação do corredor e tal. aí na hora de cadastrar o corredor só ver se ele já tem um registro praquela rodada.
na verdade data, hora, pontuação não é necessário, esse cliente precisa apenas gerar a rodada por exemplo:
Laçadores:
Diego
Carlos
Henrique
Wesley
Fabio
Pezeros:
Lucas
Eduardo
Marcio
Luciano
Vitor
ai criar as rodadas de competição assim:
1 Rodada:
Diego e Lucas
Carlos e Eduardo
Henrique e Marcio
Wesley e Luciano
Fabio e Vitor
2 Rodada
Diego e Eduardo
Carlos e Lucas
Henrique e Luciano
Wesley e Vitor
Fabio e Marcio
e assim por diante ate todos os Laçadores correrem com os pezeros.
Desculpa ate talvez para alguns seja algo simples, mais tem apenas 4 meses que trabaho com programação e estou apanhando d+ nessa tela que preciso criar.
então vamos lembrar das matrizes de nossa querida matematica
temos os grupos letras e numeros
ABCDE
12345
aí relaciona todos com todos igual o brasileirão
A e 1
A e 2
A e 3
A e 4
A e 5
B e 1
B e 2
B e 3
B e 4
B e 5
...
a mesma coisa na programção tipo
$alpha = array('A', 'B', 'C', 'D', 'E'); // array com as letras
$nums = array('1', '2', '3', '4', '5'); // array com os números
$na = count($alpha); // pegamos a quantidade de letras na array $alpha
$nn = count($nums); // pegamos a quantidade de números na array $nums
// agora bora lá distribuir todos com todos
for($l = 0; $l < $na; $l++){
for($n = 0; $n < $nn; $n++){
echo $alpha[$l] . ' com ' . $nums[$n] . '<hr>';
}
}
mais ou menos isso aí veja se pega a lógicaHum legal, agora uma duvida relacionada mais ao PHP, como eu colocaria por exemplo
$alpha tudo que tem no meu banco dentro de um array.
Hoje uso assim:
while ($vetor=mysql_fetch_array($sql)) {
}
isso aí já é um array, olha o nome array depois do fetch. a lógica é a mesma só mudou for por while. for, while e foreach tem a mesma função de iterar sobre arrays com algumas poucas diferenças. se tem duas tabelas como falou vais botar as duas em dois whiles no lugar das letras e números do meu exemplo. só vais mudar isso, for por while e minhas arrays pelas das duas tabelas. agora se vais usar uma tabela só como falei no primeiro comentário aí vai ter que separar cabeças de pés. aí tu pode montar outras duas arrays cada uma com seu tipo. vamos supor que na tabela tem os campos nome com o nome da figura e tipo com o cabeceiro ou pezeiro
$arr_cab = array();
$arr_pez = array();
while ($vetor=mysql_fetch_array($sql)){
if($vetor['tipo'] == 'cabeceiro'){
array_push($arr_cab, $vetor['nome']);
}else{
array_push($arr_pez, $vetor['nome']);
}
}
array_push é uma função que acrescenta elementos a uma array já existente. agora é só iterar sobre $arr_cab e $arr_pez no lugar das duas que eu dei de exemplo anteriormenteCara creio eu que funcionou, vou fazer os ultimos testes e dando ok venho para marcar como resolvido
marsolim o problema e que fica em ordem.
se eu tenho 2 cabeceiros e 2 pezeiros por exemplo
Cabeceiro:
Bruno
Wesley
Pezeiro:
Vitor
Lorran
quando esta gerando as rodadas ta ficando assim:
Bruno e Vitor
Wesley e Vitor
Bruno e Lorran
Wesley e Lorran
na rodada esta ficando todos cabeceiros com o mesmo pezeiro.
a lógica no caso é formar todas as rodadas nesse loop e fazer o cadastro de todas elas de uma vez só ou seja. seguindo meu exemplo anterior ficaria assim
RODADA 1
A - 1
B - 2
C - 3
D - 4
E - 5
RODADA 2
A - 2
B - 3
C - 4
D - 5
E - 1
RODADA 3
A - 3
B - 4
C - 5
D - 1
E - 2
RODADA 4
A - 4
B - 5
C - 1
D - 2
E - 3
RODADA 5
A - 5
B - 1
C - 2
D - 3
E - 4
vamos dar uma incrementada mais ou menos assim
$arr_cab = array();
$arr_pez = array();
while ($vetor=mysql_fetch_array($sql)){
if($vetor['tipo'] == 'cabeceiro'){
array_push($arr_cab, $vetor['nome']);
}else{
array_push($arr_pez, $vetor['nome']);
}
}
$nc = count($arr_cab); // pegamos a quantidade de letras na array $alpha
$np = count($arr_pez); // pegamos a quantidade de números na array $nums
$i = 0;
// agora bora lá distribuir todos com todos
for($c = 0; $c < $nc; $c++){
for($p = 0; $p < $np; $p++){
$i = (($i == $np) ? 0 : $i++);
echo $arr_cab[$c] . ' com ' . $arr_pez[$i] . '<hr>';
}
}
ve se desse jeito dá o echoa a lista do jeito que espera. aí a ideia depois disso é formar a query pra cadastrar todas as rodadas de uma vez ou seja já tem os brody tudo cadastrado e agora vai gerar as rodadas pra eles igual o brasileirão mesmo não é?Isso e basicamente igual ao brasileirão, mais dessa maneira não funcionou, ate que os cabeceiros ele pegou todos, mais os pezeiros so o primeiro da lista.
no meu banco eu possuo 2 cabeceiros e 2 pezeiros

estou terminando um trabalhinho aqui, já posto a solução
olha tenta adaptar o meu modelo ao seu aí trocando as arrays
$alpha = array('A', 'B', 'C', 'D', 'E'); // array com as letras
$nums = array('1', '2', '3', '4', '5'); // array com os números
$na = count($alpha); // pegamos a quantidade de letras na array $alpha
$nn = count($nums); // pegamos a quantidade de números na array $nums
$i = 0;
// agora bora lá distribuir todos com todos
for($n = 0; $n < $na; $n++){
for($a = 0; $a < $na; $a++){
echo $alpha[$a] . ' com ' . $nums[$i] . '<br>';
$i = (($i == $nn - 1) ? 0 : $i + 1);
}
$i += 1;
echo '<hr>';
}
MEU RESULTADO
A com 1B com 2C com 3D com 4E com 5
A com 2B com 3C com 4D com 5E com 1
A com 3B com 4C com 5D com 1E com 2
A com 4B com 5C com 1D com 2E com 3
A com 5B com 1C com 2D com 3E com 4Marsolim funcionou quase que perfeitamente, o unico problema que ainda estou tendo e quando o numero de cabeçeiros e pezeiros não é igual.
Por exemplo se eu tiver mais pezeiros ele só cria a primeira rodada, e se eu tiver mais cabeceiros ele cria um monte de rodada sem ninguem como pezeiro, mais no mais e isso mesmo.
e como deve ficar quando assim fores? tipo se tiver mais cabeça ou mais pé?
tipo mais cabeça
========================
| CABEÇA | PÉ |
========================
| batman | flash |
|----------+-----------|
| gavião | superman |
|----------+-----------|
| dick | |
|----------+-----------|
| guy | |
|----------+-----------|
tipo mais pé
========================
| CABEÇA | PÉ |
========================
| aranha | ciclope |
|-----------+----------|
| wolverine | mercurio |
|-----------+----------|
| | iron man |
|-----------+----------|
| | tocha |
|-----------+----------|
primeiro de tudo, primeirinho de tudo mesmo, por que duas tabelas para os laçadores? tu pode ter um campo na tabela de nome tipo_lacador por exemplo pra dizer se é cabeçudo ou pezudo.