Ir para conteúdo
Fórum Script Brasil
  • 0

Duvida de lógica - Select ou Array_rand


henrique antevere

Pergunta

Preciso obter de resposta arrays com duplas de ID´s, essas duplas são jogadores de xadrez. Eu até fiz usando o array_rand porém como são alunos de escolas diferentes, na primeira chave de confrontos não pode haver alunos da mesma escola se enfrentando, gostaria de idéias de como posso fazer isso.

TABELA_INSCRICOES

ID | ID_aluno | ID_escola | Categoria

1 | 1 | 1 | Iniciante

2 | 8 | 1 | Intermediario

3 | 9 | 2 | Intermediario

4 | 15 | 2 | Iniciante

5 | 18 | 3 | Iniciante

6 | 21 | 1 | Iniciante

Com base nesses dados (exemplo) a chaves de jogos da categoria iniciante precisam ser: [1,15] e [18,21] isso porque os alunos com ID 1 e 21 são da mesma escola e não podem se enfrentar. Tem como implementar algo no array_rand que crie esse filtro ou mesmo um select que traga os resultados ? Já queimei meus neuronios e não consigo pensar em nenhuma lógica.

$input = array("1", "8", "9", "15", "18", "21"); $rand_keys = array_rand($input, 2); echo $input[$rand_keys[0]] . "\n"; echo $input[$rand_keys[1]] . "\n";

Os dados que tenho são: ID_aluno, ID_escola e Categoria. A categoria já uso no select para separar e então gerar o array com os alunos da sua categoria.

Agradeço se me ajudarem, estou usando PHP e mysql.

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Problema complicado, eu apelaria para o Copilot:

<?php
// Lista de jogadores
$jogadores = [
    ['aluno' => 1, 'escola' => 1, 'categoria' => 'iniciante'],
    ['aluno' => 8, 'escola' => 1, 'categoria' => 'intermediario'],
    ['aluno' => 9, 'escola' => 2, 'categoria' => 'intermediario'],
    ['aluno' => 15, 'escola' => 2, 'categoria' => 'iniciante'],
    ['aluno' => 18, 'escola' => 3, 'categoria' => 'iniciante'],
    ['aluno' => 21, 'escola' => 1, 'categoria' => 'iniciante'],
];

// Função para agrupar jogadores por categoria
function agruparPorCategoria($jogadores) {
    $categorias = [];
    foreach ($jogadores as $jogador) {
        $categorias[$jogador['categoria']][] = $jogador;
    }
    return $categorias;
}

// Agrupar jogadores por categoria
$categorias = agruparPorCategoria($jogadores);

// Função para gerar chaves de jogos
function gerarChaves($categoriaJogadores) {
    $chaves = [];
    $numJogadores = count($categoriaJogadores);

    for ($i = 0; $i < $numJogadores; $i++) {
        for ($j = $i + 1; $j < $numJogadores; $j++) {
            if ($categoriaJogadores[$i]['escola'] !== $categoriaJogadores[$j]['escola']) {
                $chaves[] = [
                    'jogador1' => $categoriaJogadores[$i]['aluno'],
                    'jogador2' => $categoriaJogadores[$j]['aluno']
                ];
            }
        }
    }

    return $chaves;
}

// Gerar chaves de jogos por categoria
$chavesPorCategoria = [];
foreach ($categorias as $categoria => $categoriaJogadores) {
    $chavesPorCategoria[$categoria] = gerarChaves($categoriaJogadores);
}

// Exibir chaves de jogos
foreach ($chavesPorCategoria as $categoria => $chaves) {
    echo "Categoria: $categoria<br>";
    foreach ($chaves as $chave) {
        echo "Jogador {$chave['jogador1']} vs Jogador {$chave['jogador2']}<br>";
    }
    echo "<br>";
}
?>

/*
Categoria: iniciante
Jogador 1 vs Jogador 15
Jogador 1 vs Jogador 18
Jogador 15 vs Jogador 18
Jogador 15 vs Jogador 21
Jogador 18 vs Jogador 21

Categoria: intermediario
Jogador 8 vs Jogador 9
*/

 

Link para o comentário
Compartilhar em outros sites

  • 0

Que show... nunca chegaria nesse código, Frank muito obrigado mesmo. Só vou estudar ele agora para fazer um ajuste, os jogadores não enfrentam todos, é tipo monta-se as duplas e os vencedores avançam para a próxima etapa. Algo como chave 1 (aluno a x aluno b) e chave 2 (aluno c x aluno d), o vencedor da chave 1 enfrenta o vencedor da chave 2. Os perdedores já são eliminados.

A resposta precisa ser:

/*
Categoria: iniciante
Jogador 1 vs Jogador 15
Jogador 18 vs Jogador 21

Categoria: intermediario
Jogador 8 vs Jogador 9
*/
Editado por henrique antevere
Faltou finalizar o texto com o exemplo
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...