Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trier un tableau et lui ajouter des valeurs en +

Sujet résolu
    14 mai 2021 à 0:10:34

    Bonjour,

    Alors ça va être un peu tricky à expliquer mais je me lance.

    J'ai un formulaire qui en gros me donne des joueurs avec des scores (plus une durée de partie) et quand je valide j'obtiens l'array suivant :

    array(3) {
      [1]=>
      array(2) {
        ["id_joueur"]=>
        string(6) "Steeve"
        ["score"]=>
        string(2) "54"
      }
      [2]=>
      array(2) {
        ["id_joueur"]=>
        string(4) "Nico"
        ["score"]=>
        string(2) "56"
      }
      [3]=>
      array(2) {
        ["id_joueur"]=>
        string(3) "Mat"
        ["score"]=>
        string(2) "34"
      }
    }

    Ce que je voudrais faire c'est donner des points aux joueurs en fonction de leur score. Pour une partie à 3, le 1er aurait 7 points, le 2ème 4 points et le dernier 0 point (que je multiplierais par la durée de partie mais c'est une autre histoire) et insérer ces points dans un champ de ma table en même temps que j'insère le joueur, son score et la durée de partie.

    Pour infos j'insère dans ma table avec cette requête :

    if (isset($_POST['joueurs']) && is_array($_POST['joueurs'])) {
    foreach ($_POST['joueurs'] as $joueur) {
        $resultat->execute(array($lastid, $joueur['id_joueur'], $joueur['score']));
    }
    }

    Et donc je voudrais ajouter $joueur['points'] à la fin

    Faut-il donc que je trie (ursort ?) mon array pour pouvoir attribuer les points ensuite en ajouter une ligne ? le problème c'est que j'ai des array pour chaque joueur dans mon array... Faut-il faire le trie avant validation du form ? Je suis coincé et je ne vois pas comment faire.

    Et pour compliquer les choses, pour une partie à 4 joueurs les points seraient différents (10, 6, 4, 0). Et également pour 2 ou 5 joueurs...

    Si vous avez des pistes à me donner (voir la solution :p )

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      14 mai 2021 à 0:22:16

      Je pense que faire un tri sur le score pour ensuite appliquer le bonus (en même temps que tu exécutes la requête) serait le mieux.

      Pour la suite, il faut voir comment tu définis ces points (un(des) tableau(x)) ?

      $joueurs = [
          [
              "id_joueur" => "Steeve",
              "score" => "54"
          ],
          [
              "id_joueur" => "Nico",
              "score" => "56",
          ],
          [
              "id_joueur" => "Mat",
              "score" => "34",
          ],
      ];
      
      usort(
          $joueurs,
          function ($a, $b) {
              return $b['score'] <=> $a['score'];
          }
      );
      var_dump($joueurs);
      

      -
      Edité par julp 17 mai 2021 à 17:38:33

      • Partager sur Facebook
      • Partager sur Twitter
        17 mai 2021 à 17:29:03

        Bonjour,

        C'est une bonne idée mais je n'arrive pas à la mettre en place. ta fonction fontionne nickel quand je l'intègre mais en essayant de récupérer mes données je block.

        Puis-je directement la mettre dans le foreach (vu que c'est là qu'on défini $joueurs) ?

        genre ça :

        if (isset($_POST['joueurs']) && is_array($_POST['joueurs'])) {
        foreach ($_POST['joueurs'] as $joueur) {
            usort(
                $joueurs,
                function ($a, $b) {
                    return $b['score'] <> $a['score'];
                }
            );
            var_dump($joueurs);
        }

        Evidemment non car je récupère un array (et même plusieurs) et non une variable...

        Sinon oui je pensait à un tableau pour les points

        2j - 3j - 4j - 5j

        4 - 7 - 10 - 12

        0 - 4 - 6 - 8

        / - 0 - 4 - 5

        / - / - 0 - 3

        / - / - / - 0

        • Partager sur Facebook
        • Partager sur Twitter
          17 mai 2021 à 17:39:49

          Non, il faut le faire avant et c'est $_POST['joueurs'] que tu dois usort, $joueurs n'existe même pas sur ce que tu montres.

          const BONUS = [
              5 =&gt; [12, 10, 7, 4, 0], // quand il y a 5 joueurs, le 1er a un bonus de 12 points, le 2e : 10 points, ...
              4 =&gt; [8, 6, 4, 0], // pour 4 joueurs, le 1er obtient un bonus de 8 points, le 2e : 6 points, ...
              3 =&gt; [5, 4, 0],
              2 =&gt; [0, 0],
          ];
          
          if (isset($_POST['joueurs']) &amp;&amp; is_array($_POST['joueurs']) /* &amp;&amp; array_key_exists(count($_POST['joueurs']), BONUS)*/) {
              usort(
                  $_POST['joueurs'],
                  function ($a, $b) {
                      return $b['score'] &lt;=&gt; $a['score'];
                  }
              );
              foreach ($_POST['joueurs'] as $k =&gt; $joueur) {
                  $resultat-&gt;execute([$lastid, $joueur['id_joueur'], $joueur['score'] + BONUS[count($_POST['joueurs'])][$k]]);
              }
          }
          

          ?

          (comme d'habitude ces foutus &lt;/&gt;/&amp; sont des </>/&)

          -
          Edité par julp 18 mai 2021 à 11:30:11

          • Partager sur Facebook
          • Partager sur Twitter
            18 mai 2021 à 9:36:33

            ça y est en voyant ton code je comprends le fonctionnement de usort. Si je peux me permettre j'ai encore deux questions : à quoi ça sert la fonction que tu as mis en commentaire ici : " array_key_exists(count($_POST['joueurs']), BONUS) "

            Du coup j'ai ce code : 

            if (isset($_POST['joueurs']) && is_array($_POST['joueurs']) /* && array_key_exists(count($_POST['joueurs']), BONUS)*/) {
                usort(
                    $_POST['joueurs'],
                    function ($a, $b) {
                        return $b['score'] <> $a['score'];
                    }
                );
                foreach ($_POST['joueurs'] as $k => $joueur) {
                    $resultat->execute([$lastid, $joueur['id_joueur'], $joueur['score'] + BONUS[count($_POST['joueurs'])][$k]]);
                }
            }

            Et du coup ma deuxième question : je dois avoir un souci de tri, quand je fais : Steeve 9, Nico 8, Romain 10 avec bonus 7 / 4 / 0 j'obtiens Steeve 9, Nico 15, Romain 14. Donc romain a eu le de 4 alors qu'il est premier, Nico de 7 alors qu'il est dernier et Steeve de 0 alors qu'il est 2ème. Bizarre.

            un var_dump de $_post['joueurs'] après le tri dans le foreach me donne ça :

            array(3) {
              [0]=>
              array(2) {
                ["id_joueur"]=>
                string(1) "2"
                ["score"]=>
                string(1) "8"
              }
              [1]=>
              array(2) {
                ["id_joueur"]=>
                string(1) "3"
                ["score"]=>
                string(2) "10"
              }
              [2]=>
              array(2) {
                ["id_joueur"]=>
                string(1) "1"
                ["score"]=>
                string(1) "9"
              }
            }



            Merci encore, je vais finir par te créditer sur le site ;)

            EDIT : Je crois que j'ai trouvé, il manquait le "=" ici : return $b['score'] <> $a['score'];

            Du coup en mettant return $b['score'] <=> $a['score']; ça a l'air de fonctionner. Par contre je vais modifier le execute parce que mon but n'était pas d'voir un bonus pour le score mais bien une nouvelle entrée dans la table à côté de score qui s'appelle "points" (que je multiplierai par la durée de la partie). Je m'y mets

            -
            Edité par bol2ry 18 mai 2021 à 9:59:41

            • Partager sur Facebook
            • Partager sur Twitter
              18 mai 2021 à 11:32:44

              > à quoi ça sert la fonction que tu as mis en commentaire ici : " array_key_exists(count($_POST['joueurs']), BONUS) "

              A n'accepter/prendre (si décommenté) que les formulaires soumis avec autant de joueurs que les clés de ce tableau BONUS (soit uniquement avec 2 à 5 joueurs - tous deux compris)

              > EDIT : Je crois que j'ai trouvé, il manquait le "=" ici : return $b['score'] <> $a['score'];

              Yep, j'étais reparti de ton code sans le voir

              • Partager sur Facebook
              • Partager sur Twitter
                18 mai 2021 à 13:39:29

                Super merci pour les précisions ! Je crois que je vais étendre à 6 joueurs et décommenter pour le prendre en compte ! :D

                Le site fonctionne parfaitement, c'est cool parce que le tournois commence vendredi ! Maintenant j'attaque le HTML/CSS

                Encore merci pour ton aide je n'aurais jamais réussi à temps sans ça :)

                • Partager sur Facebook
                • Partager sur Twitter

                Trier un tableau et lui ajouter des valeurs en +

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown