Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème asort PHP

    1 mai 2018 à 22:54:25

     Bonsoir à tous,

    J'utilise la fonction asort pour la première fois, et je tente en vain de trier un tableau de données du type "id_catégorie" => "intitule_catégorie".

    Ce tableau est construit à partir d'une table dans laquelle les sous_catégories sont mélangées avec les parents. 

    Afin d'afficher tout dans un select, je concatène donc les noms des catégories parentes avec celles des enfants pour avoir quelque chose du type : "catégorie grand-parent > catégorie parent > catégorie enfant" (ce juste pour afficher des intitulés lisibles dans mon select).

    Aucun soucis pour obtenir ces libellés, mais le tri via asort n'est pas satisfaisant.

    J'obtiens un ordre qui me semble aléatoire du type : 

    categorie 1 > chaussures

    categorie 1 > accessoires

    categorie 1 > vetements

    categorie 2 >toto

    etc...

    j'ai bien catégorie 2 après catégorie 1 mais dans les sous-catégories accessoires est après chaussures, je ne comprends pas pourquoi...ci-dessous mon code en espérant que vous puissiez m'aider :)  

    <?php
    $req_cat=$bdd->query("SELECT * from categorie_materiel order BY intitule_categorie");
    $cat=array();
    $count=0;
    while($c=$req_cat->fetch())
    {
    	$cat[$count]["id"]=$c["id_categorie_materiel"];
    	$cat[$count]["intitule"]=$c["intitule_categorie"];
    	$cat[$count]["id_parent"]=$c["categorie_parent"];
    	$count++;
    }
    $req_cat->closeCursor();
    $categorie=array();
    foreach ($cat as $ligne) {
    	$intitule=$ligne["intitule"];
    	if($ligne["id_parent"]>0) // il existe un parent
    		{
    			//on recherche donc l'intitulé complet
    			$intitule=intitule_cat($ligne["id_parent"], $cat)." ".$ligne["intitule"];
    			//fonction intitule_cat parcours l'array et concatène l'intitulé avec des > pour les sous catégories, retourne une chaine de caractères
    		}
    	$categorie[$ligne["id"]]=$intitule;
    }
    asort($categorie);
    
    	return($categorie);
    ?>

    -
    Edité par adrien75013 1 mai 2018 à 22:55:58

    • Partager sur Facebook
    • Partager sur Twitter
      2 mai 2018 à 8:02:10

      Bonjour,

      As tu essayé de faire le tri directement dans la requête SQL ? cela me semblerait plus efficace voire plus simple que d'extraire des données puis de constituer un tableau en php puis de vouloir trier le tableau obtenu.

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        2 mai 2018 à 8:41:33

        Bonjour,

        Le soucis c'est que dans ma table, les sous catégories ne reprennent pas l'intitulé des catégories parents. Donc le tri par ordre alphabétique ne sera pas intéressant pour le coup....

        Chaque catégorie à un id, un intitulé et un id_parent (valant 0 pour les catégories mères) 

        • Partager sur Facebook
        • Partager sur Twitter
          2 mai 2018 à 9:05:44

          adrien75013 a écrit:

          Bonjour,

          Le soucis c'est que dans ma table, les sous catégories ne reprennent pas l'intitulé des catégories parents.

          Bonjour,

          C'est donc plus un problème de conception du modèle. Tu devrais avoir deux tables, avec une clé étrangère dans la table sous-catégorie reprenant l'id de la table catégorie.

          • Partager sur Facebook
          • Partager sur Twitter
            2 mai 2018 à 11:08:48

            Bonjour Philodick,

            J'ai pensé faire ça, mais je voulais pouvoir ajouter autant de niveaux de sous-catégories que possible...

            • Partager sur Facebook
            • Partager sur Twitter
              2 mai 2018 à 11:30:18

              Salut !

              Dans le cas simple, une seule table avec une colonne indiquant l'ID de la catégorie parente devrait déjà aider.

              Et pour simplifier les récupérations dans le cas de hiérarchies illimitées, il y a la représentation intervallaire. Là où cette solution est plus compliquée, c'est avec les opérations comme la mise à jour ou la suppression, l'insertion aussi, mais un peu moins.

              • Partager sur Facebook
              • Partager sur Twitter
                2 mai 2018 à 11:39:17

                Dans ce cas tu as ceci : https://sqlpro.developpez.com/cours/arborescence/

                Mais je sais que ce n'est pas si simple à appréhender.

                Sinon, tu peux aussi plus simplement créer une table "catégorie" avec toutes les catégories et sous-catégories et une autre table de relation avec tous les liens directs entre une catégorie et ses sous-catégories en précisant le "niveau" (1 pour le niveau catégorie/sous-catégorie, 2 pour le niveau catégorie/sous-sous-catégorie, etc...)

                • Partager sur Facebook
                • Partager sur Twitter
                  2 mai 2018 à 12:59:50

                  Pour aller dans le sens des réponses ci-dessus, il y a déjà à mon avis un problème de modélisation de ton sujet.

                  Quand tu dis "au tant de niveaux de sous-catégories possibles" c'est combien ? 2, 3, ... 10, ... 100, ... ton exemple portant sur les vêtements le nombre de catégories et sous-catégories me semble vite limité.

                  Et de toute manière ton approche initiale sera d'au tant plus complexe que tu auras de niveaux.

                  A+

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 mai 2018 à 13:43:04

                    Merci de toutes vos réponses.

                    Effectivement, j'ai pensé à la représentation intervallaire mais elle me parait un peu complexe je ne pense pas pouvoir la maîtriser facilement...

                    Je pense à maximum 5 - 6 catégories.

                    Au final, j'ai bien les données que je veux (un array clé => libellé ) mais  j'ai "simplement" un problème de tri alphabétique de la colonne "libellé".

                    Le comportement de la fonction "ASORT" vous parait normal ? 

                    -
                    Edité par adrien75013 2 mai 2018 à 13:43:18

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 mai 2018 à 13:49:44

                      Je pense que le problème vient du fait que tu veux trier un tableau multidimensionnel, non ? As-tu regardé du côté de array_multisort() ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 mai 2018 à 14:16:44

                        Non c'est un tableau bidimensionnel tout simple justement.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 mai 2018 à 16:42:50

                          Alors asort() devrait suffire... Tu peux montrer un exemple de tableau ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            3 mai 2018 à 6:17:03

                            Array ( [9] => Broyeur [20] => Convoyage [6] => Convoyage > Chaîne [5] => Convoyage > Caisse [28] => Convoyage > Maniement [25] => Convoyage > Chaîne > Chaîne longueur 12 m [12] => Packaging [13] => Mélangeuse  [19] => Séchoir [10] => Séchoir > Séchoir Droit [3] => Séchoir > Séchoir Fixe)

                            Voila le tableau obtenu après utilisation de asort.

                            Et ci-dessous le tableau initial

                            Array ( [9] => Broyeur [20] => Convoyage [28] => Convoyage > Maniement [6] => Convoyage > Chaîne [12] => Packaging [13] => Mélangeuse [19] => Séchoir [10] => Séchoir > Séchoir Droit [3] => Séchoir > Séchoir Fixe [25] => Convoyage > Chaîne > Chaîne longueur 12 m [5] => Convoyage > Caisse )



                            Qu'en penses-tu ?

                            • Partager sur Facebook
                            • Partager sur Twitter
                              3 mai 2018 à 9:14:54

                              Je me demande si par hasard tu ne souffres pas d'un amalgame entre faille XSS et faille par injection SQL. Le fait que Chaîne sorte avant Caisse est plutôt symptomatique, même si là je n'explique pas que Maniement soit avant Chaîne > Chaîne longueur 12 m.

                              Et sinon, tu as tenté natsort() ?

                              -
                              Edité par Ymox 3 mai 2018 à 9:26:28

                              • Partager sur Facebook
                              • Partager sur Twitter
                                3 mai 2018 à 17:37:57

                                Non je n'ai pas encore testé natsort. je vois ça ce soir.

                                Je ne comprends pas le problème faille XSS / injection SQL par contre :/

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  3 mai 2018 à 17:43:12

                                  C'est très simple : si tu utilises htmlspecialchars() ou htmlentities() sur des données que tu envoies en base, ça peut rendre tes tris étranges — voir le titre "En cas de classement par ordre alphabétique".

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 mai 2018 à 9:09:00

                                    Salut.

                                    Effectivement ce que tu pointe est une piste. Il ne me semble pas utiliser le htmlspecialchars (j'utilise bdo et les BindValue) mais je vais vérifier quand même.

                                    Je regarde ce soir.

                                    merci encore.

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Problème asort PHP

                                    × 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