Bonjour,

J'aimerais avoir de l'aide pour trier des données.
Je m'explique, j'ai 20 utilisateurs inscrits à une compétitions (Ligue 1 par exemple).

Ces 20 utilisateurs doivent tous se rencontrer deux fois (Match aller et retour).
J'aimerais, en PHP, insérer toutes les combinaisons possibles aléatoirement.

Ce qui me permettra, une fois un utilisateur connecté, de pouvoir voir sur son profil les matchs qu'il lui reste à jouer.
Et ensuite faire ces matchs et les validers et ensuite générer un classement.

Auriez-vous des idées ?

Merci de votre aide.

Amicalement,
DexX

10 réponses


Nairolf
Réponse acceptée

J'ai pas trop suivi, enfin si par exemple tu veux que chaqu'un joue une fois contre un autre fait ça.

<u>Code:</u>

<?php
$joueurs = array('DexX', 'Apo39', 'Julien');
$i = 1;
foreach ($joueurs as $e1) {
    foreach (array_slice($joueurs, $i) as $e2) {
        $matchs] = $e1.' - '.$e2;
    }
$i++;
}
echo "<pre>";
print_r($matchs);
echo "</pre>";
?>

<u>Résultat:</u>

Array
(
    [0] => DexX - Apo39
    [1] => DexX - Julien
    [2] => Apo39 - Julien
)

Si tu veux juste qu'il n'y a pas de joueur jouant contre lui même fait ça:

<u>Code:</u>

<?php
$joueurs = array('DexX', 'Apo39', 'Julien');
foreach ($joueurs as $e1) {
    foreach ($joueurs as $e2) {
        if ($e1 != $e2) {$matchs] = $e1.' - '.$e2;}
    }
}
echo "<pre>";
print_r($matchs);
echo "</pre>";
?>

<u>Résultat:</u>

Array
(
    [0] => DexX - Apo39
    [1] => DexX - Julien
    [2] => Apo39 - DexX
    [3] => Apo39 - Julien
    [4] => Julien - DexX
    [5] => Julien - Apo39
)

Bien sûr tu peux le faire avec autant de joueur que tu veux:

Avec

$joueurs = array('Joueur A', 'Joueur B', 'Joueur C', 'Joueur D', 'Joueur E');

Array
(
    [0] => Joueur A - Joueur B
    [1] => Joueur A - Joueur C
    [2] => Joueur A - Joueur D
    [3] => Joueur A - Joueur E
    [4] => Joueur B - Joueur C
    [5] => Joueur B - Joueur D
    [6] => Joueur B - Joueur E
    [7] => Joueur C - Joueur D
    [8] => Joueur C - Joueur E
    [9] => Joueur D - Joueur E
)
Array
(
    [0] => Joueur A - Joueur B
    [1] => Joueur A - Joueur C
    [2] => Joueur A - Joueur D
    [3] => Joueur A - Joueur E
    [4] => Joueur B - Joueur A
    [5] => Joueur B - Joueur C
    [6] => Joueur B - Joueur D
    [7] => Joueur B - Joueur E
    [8] => Joueur C - Joueur A
    [9] => Joueur C - Joueur B
    [10] => Joueur C - Joueur D
    [11] => Joueur C - Joueur E
    [12] => Joueur D - Joueur A
    [13] => Joueur D - Joueur B
    [14] => Joueur D - Joueur C
    [15] => Joueur D - Joueur E
    [16] => Joueur E - Joueur A
    [17] => Joueur E - Joueur B
    [18] => Joueur E - Joueur C
    [19] => Joueur E - Joueur D
)

Tu as juste à remplacer

$joueurs = array('Joueur A', 'Joueur B', 'Joueur C', 'Joueur D', 'Joueur E');

par:

$sql = 'SELECT User.username FROM users as User, inscriptions_championnats as Inscription WHERE User.id = Inscription.user_id AND Inscription.championnat_id = 1';
$query = mysql_query($sql) or die(mysql_error());
while($data = mysql_fetch_assoc($query)) {
   $joueurs] = $data'username'];
}
Typhon
Réponse acceptée

Il te faut un table "matchs" construit de cette manière

matchs(<u>id_match</u>, id_joueur_1, id_joueur_2, type, date, winner);

id_match est la clé primaire d'un match
id_joueur_1 est une clé étrangère qui correspond à l'id du premier joueur
id_joueur_2 est une clé étrangère qui correspond à l'id du deuxième joueur
type est le type de match qui se déroule, tu y mets "Aller" si c'est un match Aller et "Retour" si c'est un match Retour
winner est une clé étrangère qui correspond à l'id du joueur gagnant et qui vaut null, si on ne connait pas encore le gagnant

Avec une telle construction cela permet très rapidement de retrouver toutes les infos utiles à chaque joueur, par exemple

Tout les matchs auxquels il a participé ou va participer

SELECT * FROM matchs WHERE (id_joueur_1 = id_joueur OR id_joueur_2 = id_joueur)

Tout les matchs auxquels il a participé

SELECT * FROM matchs WHERE (id_joueur_1 = id_joueur OR id_joueur_2 = id_joueur) AND date < now()

Tout les matchs auxquels il va participer

SELECT * FROM matchs WHERE (id_joueur_1 = id_joueur OR id_joueur_2 = id_joueur) AND date > now()

Tout les matchs qu'il a gagné

SELECT * FROM matchs WHERE winner = id_joueur

Tout les matchs qu'il a perdu

SELECT * FROM matchs WHERE (id_joueur_1 = id_joueur OR id_joueur_2 = id_joueur) AND winner != id_joueur AND winner IS NOT NULL

Et tu peux enfin trier/filtrer chacune de ces recherches par le type "Aller" ou "Retour" en ajoutant à la fin

AND type="Aller"

ou

AND type="Retour"
Nairolf
Réponse acceptée

Moi j'ajouterai un champ 'resultat' pour avoir le score et au lieu d'utiliser le champ date pour vérifier les matchs joués je conseille plutôt un champ jouer qui contient soit la valeur 0 (tu met ça par défaut) ou 1 quand il est joué, car vu que c'est un tournoi amateur je pense que tu vas préférer laisser les joueurs s'arranger entre eux pour une date au lieu de la fixer d'avance. Tu peux laisser le champ date pour savoir quand il a été joué le match

Nairolf
Réponse acceptée

En faite quand tu fait le tableau des joueurs tu fais ça: $joueurs] = $data'username']; au lieu de $data'username'] tu fais $data'id'] enfin après ça dépend de ta table.

Puis dans la deuxième boucle tu as juste à faire:

$sql = "INSERT INTO matchs (id_match,id_joueur_1,id_joueur_2,type,date,gagnant,jouer) VALUES(null,".$e1.",".$e2.",'Aller/Retour',null,null,0)";
mysql_query($sql);
Nairolf
Réponse acceptée

Ba vaut mieux que ça soit automatique, car par backoffice je présume que tu vas créer un bouton "Générer le tournoi" qui fera la même chose que si par exemple la dernière personne et qu'alors le script se lance

DexX
Auteur

Voilà ce que j'ai fais :

$sql = 'SELECT User.username FROM users as User, inscriptions_championnats as Inscription WHERE User.id = Inscription.user_id AND Inscription.championnat_id = 1';
$table = array();
$query = mysql_query($sql) or die(mysql_error());
while($data = mysql_fetch_assoc($query)) {
   $table] = $data'username'];
}
$result_table = $table;
foreach($table as $element1) {
    foreach($result_table as $element2) {
            $tabl_temp] = $element1.$element2;
    }
}
$result_table = $tabl_temp;
unset($tabl_temp);
print_r($result_table);

Ce qui affiche :

Array ( [0] => DexXDexX [1] => DexXApo39 [2] => DexXJulien [3] => Apo39DexX [4] => Apo39Apo39 [5] => Apo39Julien [6] => JulienDexX [7] => JulienApo39 [8] => JulienJulien )

Comme vous le voyez, sa m'affiche « DexXDexX ».
Comment faire pour supprimer « DexXDexX », « Apo39Apo39 »..les combinaisons doubles.

Je pense être sur la bonne voie ? Il faut ensuite que je fasse un Insert de ces combinaisons pour générer les matchs et les journées à jouer.
Pensez-vous que je suis sur la bonne voie ?

Merci ;)

DexX
Auteur

Bonjour Nairolf,

Je te remercie de ta réponse.
J'ai compris le principe et tu as très bien répondu à ma question.

Suite à cela, le but serait d'y sauvegarder dans une table ou plusieurs tables de façon, ensuite, si le joueur 1 se connecte sur son compte, sa lui affiche les matchs qu'il lui reste à jouer.

Tu aurais une idée de comment modéliser cette ou ces table(s) ?

Merci.

Amicalement,
DexX

DexX
Auteur

D'accord, merci beaucoup de ton aide !

Mais, par rapport au code que tu m'as mis dans ton premier message, comment faire pour récupérer l'ID du pseudo du joueur 1 et 2 sachant que quand je fais un echo de $e1, ça m'affiche les deux pseudos.
De façon à pouvoir faire un Insert dans la table match.

Je ne sais pas si tu voies ce que je veux dire.

Bonjour,
ça pourra peut-être aider, je suis tombé sur ce site une fois League generator, qui permet de générer des matchs avec un certains nombres d'équipe.
Il y a un exemple et le code source php. Si ça peut aider.

Edouard

DexX
Auteur

Bonjour,

Merci, sympa pour le lien ;)

En tout cas merci de vos aides, j'ai pu avancer sur cette partie.
Encore une dernière question, selon vous, la génération des matchs comme vous me l'avez éclaircie doit se faire automatiquement une fois le plafond des inscriptions atteint ou manuellement depuis un backoffice ?

Je reviendrais surement vous voir, afin d'avoir de l'aide pour la génération du classement des championnats et leurs sauvegardes dans la base de données, ainsi que la gestion des coupes (Comment générer les huitièmes de finales...etc) ^^

Amicalement,
DexX