Rechercher : dans
Par :

Fonction récursive et manipulation de tableau

Dernière réponse le 10 sep 2007 à 21:07:31 yazerty, le 9 sep 2007 à 22:18:02 
 Signaler ce message aux modérateurs

Bonjour,

J'ai une table mysql avec ceci :

category_id - category - parent_num
1 - Catégorie 1 - 0
2 - Catégorie 2 - 5
3 - Catégorie 3 - 2
4 - Catégorie 4 - 3
5 - Catégorie 5 - 3




Il s'agit d'un système de catégorie à plusieurs niveaux. Une catégorie peut en contenir une autre (ceci à l'infini). Si je suis dans la catégorie 5 le fil d'ariane peut ainsi donner :

Index > Catégorie 3 > Catégorie 5 >Catégorie 2

Je souhaite donc faire un fil d'ariane. J'ai abouti à cette fonction :

// Fil d'Ariane
$category_id = $db_data['category_id'];
echo $category_id; // affiche bien l'id de la catégorie en cours

function getTopParent($pi_current, $pa_data)
        {

            // sql + query
            $sSql = "SELECT parent_num, category FROM categories WHERE category_id=$pi_current";
            $req = mysql_query($sSql) or die(mysql_error());

            if (mysql_num_rows($req)>0)
            {
                $aData = mysql_fetch_assoc($req);
                $pa_data = array($aData);
                getTopParent($aData['parent_num'], $pa_data);
            }
        }

        // Appel de la function
        getTopParent($category_id, $pa_data) ;
       
        // Reverse l'ordre des resultats pour avoir en premier le root
        $aFinalData = array_reverse($pa_data) ; 

// pour parcourir ce tableau, utilisons la boucle foreach
foreach($individu as $cle=>$valeur)
    {
    echo $cle.' : '.$valeur.'<br>';
    } 


Mais cela me sort ce message d'erreur :

Warning: array_reverse() [function.array-reverse]: The argument should be an array


pour la ligne correspondant à :

$aFinalData = array_reverse($pa_data) ;


Le problème semble venir de (la mauvaise) insertion des données dans le tableau, car lorsque je fais seulement:

function getTopParent($pi_current, $pa_data)
        {

            // sql + query
            $sSql = "SELECT parent_num, category FROM categories WHERE category_id=$pi_current";
            $req = mysql_query($sSql) or die(mysql_error());

            if (mysql_num_rows($req)>0)
            {
                $aData = mysql_fetch_assoc($req);
                echo $aData['category'];
                getTopParent($aData['parent_num'], $pa_data);
            }
        }


        // Appel de la function
        getTopParent($category_id, $pa_data) ;


Cela m'affiche bien le nom de mes catégories, mais dans l'ordre inverse d'un fil d'ariane (à gauche il y a la catégorie la plus basse dans la hiérarchie et à droite la plus haute, alors que ça devrait bien sûr être l'inverse pour un fil d'ariane...). D'où l'idée de stocker les données dans un tableau pour ensuite inverser le tableau et afficher les données (si vous avez mieux je suis tout autant preneur :) ).

J'ai cherché avec mon ami Google les cours présentant la mise en tableau de données, mais je n'ai pas réussi à comprendre où était l'erreur dans mon code :-/... Je suppose pourtant que la bêtise est évidente :- ?

Pourriez-vous m'aider s'il vous plait :- ?
Configuration: Windows XP
Firefox 2.0.0.6

Meilleures réponses pour « Fonction récursive et manipulation de tableau » dans :
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...
Inverser les éléments d'un tableau -Récursivité- VoirVoici une procédure récursive qui permet d’inverser les éléments d’une partie d’un tableau compris entre la position p et n : Procedure Inverser (Var t : Tab; p, n : Integer); Var aux : Real; Begin If p < n Then ...
Manipulations élémentaires des tableaux sous MatLab VoirSommaire I. Stockage des tableaux II. L'indexation linéaire II.1. Accéder à un élément d'un tableau en utilisant l'indexation linéaire II.2. Passer d'une indexation à l'autre II.2.1. La fonction ind2sub II.2.2. La fonction sub2ind III. La...
VBScript - Les fonctions de manipulation de tableaux VoirLes fonctions de manipulation de tableaux Fonction Description Array(arglist) Crée un Variant contenant un tableau. L'argument arglist est la liste des valeurs, séparées par des...
Langage C - Les fonctions VoirLa notion de fonction On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps du programme principal. Les fonctions permettent d'exécuter dans plusieurs parties du...
Langage C++ - Les fonctions VoirLa notion de fonction On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps du programme principal. Les fonctions permettent d'exécuter dans plusieurs parties du...

1

caltoune, le 10 sep 2007 à 00:15:46

Bonjour,

je pense que comme ton systeme de categorie est a un niveau predifini fixe, tu devrais mettres
un critere d'arret qui porte aussi sur le maximum de catégorie possibles dans ta pile d'appels récursifs.

Ex ici ton systeme est a 5 niveaux -> il ne faut pas avoir 5 -> 3 -> 2 -> 5 -> 3 -> 2 -> 5 ... qui est une boucle à l'infini...

Il y a aussi le cas d'avoir deux parent pour un meme noeud ou deux fils différents pour un meme parent.
Est-ce que tu as un critere pour choisir un plutot que l'autre?

Répondre à caltoune

2

yazerty, le 10 sep 2007 à 02:24:32
  • +1

Mmm je ne comprends pas pourquoi tu dis que c'est sur 5 niveaux dans mon exemple :-?

Une catégorie ne peut pas avoir deux parents différents. Une catégorie n'a qu'un seul et unique parent (c'est un petit système d'annuaire).

Mais ceci peut-il réellement être la cause de l'erreur (à propos de l'enregistrement en tableau) que j'obtiens :-?

Répondre à yazerty

3

 Yazerty, le 10 sep 2007 à 21:07:31
  • +1

Problème résolu :-) !!

Répondre à Yazerty