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);
?>
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.
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)
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.
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.
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...)
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.
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.
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".
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.
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.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.