Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Fonction récursive et enregistrement ds tableau[ ] :-/ ? [ Divers / Général ] (yazerty55)

dimanche 9 septembre 2007 à 22:13:02 | Fonction récursive et enregistrement ds tableau[ ] :-/ ?

yazerty55

Bonjour,

J'ai une table mysql avec ceci :

[code]
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
...[/code]


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 :

[code]// 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>';
    } [/code]

Mais cela me sort ce message d'erreur :

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

pour la ligne correspondant à :

[code]$aFinalData = array_reverse($pa_data) ;[/code]

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

[code]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) ;[/code]

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 :- ?

dimanche 9 septembre 2007 à 22:51:40 | Re : Fonction récursive et enregistrement ds tableau[ ] :-/ ?

coockiesch

Salut!
 Il y a qqch que je comprend pas: mysql_fetch_assoc te renvoie un tableau... Pourquoi créer un autre tableau (à un seul indice) contenant ce tableau?

Ne pourrais tu pas juste faire:
$pa_data = mysql_fetch_assoc($req);
getTopParent($aData['parent_num'], $pa_data);

@++

R@f

La boîte à bouts de codes
"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"

dimanche 9 septembre 2007 à 22:59:49 | Re : Fonction récursive et enregistrement ds tableau[ ] :-/ ?

yazerty55

Bonsoir,

Merci pour ta suggestion coockiesch !
Malheureusement si je fais :

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

Ca me renvoit toujours l'erreur "Warning: array_reverse() [function.array-reverse]: The argument should be an array" sur la ligne "$aFinalData = array_reverse($pa_data) ; " :-(...

dimanche 9 septembre 2007 à 23:06:02 | Re : Fonction récursive et enregistrement ds tableau[ ] :-/ ?

coockiesch

Je comprend pas: mysql_fetch_assoc te renvoie un tableau, pouquoi tu veux absolument le bidouiller?
$pa_data = mysql_fetch_assoc($req);
getTopParent($pa_data, $pa_data);

Pcq, si tu fais:
getTopParent($aData['parent_num'], $pa_data);
$aData est un tableau, mais pas $aData['parent_num']....

@++

R@f

La boîte à bouts de codes
"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"

dimanche 9 septembre 2007 à 23:16:00 | Re : Fonction récursive et enregistrement ds tableau[ ] :-/ ?

yazerty55

Je ne suis pas sûr de comprendre quelle forme finale tu suggères je crois (désolé :-/). Pourrais-tu remettre la partie du

if (mysql_num_rows($req)>0)
            {
            }

telle que tu me suggère afin que j'y vois plus clair dans la démarche s'il te plait :- ?

dimanche 9 septembre 2007 à 23:19:19 | Re : Fonction récursive et enregistrement ds tableau[ ] :-/ ?

coockiesch

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

@++

R@f

La boîte à bouts de codes
"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"

dimanche 9 septembre 2007 à 23:32:05 | Re : Fonction récursive et enregistrement ds tableau[ ] :-/ ?

yazerty55

Merci pour ton aide !

Mmm' alors non ça ne marche pas non plus quand je fais ça :-( :

------------------
// 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);
                echo $aData['parent_num']; // Affiche bien les id des catégories parentes de celles qui doivent s'afficher
                getTopParent($aData['parent_num'], $aData);
            }
        }
 
        // Appel de la function
        getTopParent($category_id, $aData) ;
      
        // Reverse l'ordre des resultats pour avoir en premier le root
        $aFinalData = array_reverse($aData) ;
 
// pour parcourir ce tableau, utilisons la boucle foreach
foreach($individu as $cle=>$valeur)
    {
    echo $cle.' : '.$valeur.'<br>';
    }
------------------
(j'ai mis $aData à la place de pa_Data du coup pour la suite du code).

ps : par contre je crois que je vois ce que tu m'explique avec le tableau qu'il ne sert à rien de recréer puisque mysql_fetch_assoc en crée un lui-même.

dimanche 9 septembre 2007 à 23:33:25 | Re : Fonction récursive et enregistrement ds tableau[ ] :-/ ?

coockiesch

J'y réfléchis et je te redis demain, si c'est pas réglé par qlqn d'autre d'ici là!...

@++

R@f

La boîte à bouts de codes
"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"

dimanche 9 septembre 2007 à 23:36:47 | Re : Fonction récursive et enregistrement ds tableau[ ] :-/ ?

yazerty55

Merci, et bonne nuit ;-) !

lundi 10 septembre 2007 à 06:33:25 | Re : Fonction récursive et enregistrement ds tableau[ ] :-/ ?

coucou747

Salut

ta fonction ne renvoie rien... faut alors passer ce param par reference, ce qui implique de le declarer plus tot...

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[]=$aData['parent_num'];
                getTopParent($aData['parent_num'], $pa_data);
            }
        }

tu l'appelles en faisant :

$aData=array();
        // Appel de la function
        getTopParent($category_id, $aData) ;
      
        // Reverse l'ordre des resultats pour avoir en premier le root
        $aFinalData = array_reverse($aData) ;
 
// pour parcourir ce tableau, utilisons la boucle foreach
foreach($individu as $cle=>$valeur)
    {
    echo $cle.' : '.$valeur.'<br>';
    }

sinon, si tu utilises mysql5, tu peux peut-etre utiliser une fonction sql...

CREATE FUNCTION menu_deroule(id INT UNSIGNED)
RETURNS TEXT DETERMINISTIC
BEGIN
  DECLARE t TEXT;
  DECLARE r TEXT;
  DECLARE i INT UNSIGNED;
  SET i = id;
  SET t = "";
  SET r = "";
  WHILE i!=0 AND ISNULL(i)=0
  DO
    SELECT `child_of`, `titre` INTO i, t FROM `menu` WHERE menu.id=i;
    SET r = CONCAT(t, "/", r);
    IF i = id THEN
      SET i=0;
    END IF;
  END WHILE;
  RETURN r;
END;

pour ma fonction, j'avais une table :
id           child_of               titre
et je recuperais les titres separes par des /


une recherche sur exalead vous aurait peut-etre evite de poser cette question
In a dream, I saw me, drop dead...
U were there, U cried...
It was just a dream,
if I die, U won't cry, maybe, U'll be happy


1 2

Cette discussion est classé dans : code, mysql, data, catégorie, category


Répondre à ce message

Sujets en rapport avec ce message

Problème de formulaire dynamique [ par labouse ] Bonjour,Bon je vais essayer d'être clair: j'ai une table mysql avec nom prénom et un code service je fais une requete pour afficher tout le monde pour Problemes d'affichage avec une boucle tanque [ par pekplusultra ] Bonjour,Je souhaiterais afficher les resultats de ma table par liste comme ci dessous:Nom      Sujet      Envoyeur ...Mon code fo jarrive pas a finir mon code [ par Olivier885 ] slt, jai fait un code pour que quelqu'un arrive a modifier sa page perso.cette page est cencée recuperer un texte dans la base de donnée mais jarrive Insertion [ par magraf ] Salut à tous Tous le monde me parle de la communauté PHP et tous ses "mec" qui te résolve un BIG PB en 3 seconde 7, et de courage exemplaire face au " pepin avec un mysql_fetch_array() [ par justine75 ] bonjour!voilà j'ai un petit problème que je n'arrive pas à éluciderle voici : Warning: mysql_fetch_array(): supplied argument is not a valid MySQL res marche pas! [ par theopil ] Voila je n'arrive pas a faire fonction ce script !! function genCode () {    $code = '';    $chaine = 'abcdefghijklmnopqrstuvwxyz123456789';    for ( SVP un peu d'aide [ par theopil ] if ( $action == "1" ) {   function genCode () {    $code = 'BouLi';    $chaine = 'abcdefghijklmnopqrstuvwxyz123456789';    for ($i = 0; $i     &nbsp selection date bdd mysql [ par fredo35m ] Bonjour, dans ma table mysql, j'ai un date au format aaaa-mm-jjex :CODE DATExxx  2004-12-31...Ensuite, j'ai un nouveau fichier contenant un CODE et un INSERT dans une boucle WHILE : Possible ? [ par laubro ] Bonjour,j'ai une boucle while, dans laquelle je tente de faire un INSERT, mais ça ne fonctionne pas, toutes les opé marchent dans ma boucle mais pas l Correction de code simple pour debutant [ par michmichman ] Bonjour j'ai fais un petit code pour verifier si un utilisateur est enregistré dans ma db mais bien sur il marche pasje vous le montre je suis sur que


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.