Commentaires et réponses (récursivité?) - PHP - Programmation
Marsh Posté le 11-05-2010 à 14:03:25
C'est un arbre. D'ailleurs, on voit cela sur certains anciens forums où l'on a, visuellement, quelque chose qui ressemble à une liste de répertoires, avec sous-répertoires, etc.
Marsh Posté le 11-05-2010 à 15:28:23
Surtout pas la récursivité! Tu peux facilement transformer ce pb en itératif. Je l'ai implémenté dans mes 2 softs (Astres et Icare, cf ma signature).
Tu fais un tableau php contenant les éléments à traiter (ici, les commentaires) + 2 variables qui vont servir d'index. La première stockes la position de l'élément en cours de traitement et la 2ième, la position pour l'insertion du prochain élément trouvé qui sera être rajouté dans le tableau des éléments à traiter (en général, c'est en fin de tableau).
Le traitement est terminé quand les 2 index ont la même valeur.
Marsh Posté le 11-05-2010 à 15:36:43
rufo a écrit : Surtout pas la récursivité! Tu peux facilement transformer ce pb en itératif. |
Tu peux meme le coder directement en binaire, le php c'est comme la recursivite, beaucoup trop simple et indigne de nous autres.
Marsh Posté le 11-05-2010 à 15:41:19
Surtout pas la récursivité car bien souvent, tu ne maîtrises pas la taille de l'arbre (le plus gênant étant la profondeur) et donc, un parcours par récursivité va faire que tu vas pas arrêter d'empiler sur la pile les appels de fonctions, pile qui va finir par péter. A ça, tu rajoutes que la récursivité est une catastrophe en terme de perfs par rapport à l'itératif (ben oui, stocker sur la pile le contexte, ça a un coût en temps).
Donc, je répète, surtout pas de récursivité pour un parcours d'arbre.
Marsh Posté le 11-05-2010 à 16:06:03
rufo a écrit : Surtout pas la récursivité! Tu peux facilement transformer ce pb en itératif. Je l'ai implémenté dans mes 2 softs (Astres et Icare, cf ma signature). |
Ok je vais essayer de comprendre.
Citation : Tu fais un tableau php contenant les éléments à traiter (ici, les commentaires) + 2 variables qui vont servir d'index. |
Citation : Tu fais un tableau php contenant les éléments à traiter (ici, les commentaires) + 2 variables qui vont servir d'index.[quote] |
La de suite ca devient plus compliqué, si je suis bien, sur le premier commentaire je suppose qu'on mettra 1 pour la position et par contre pour l'insertion du prochaine élément j'ai pas trop saisi.
Si tu peux aussi me dire dans quel fichier tu gères cela dans tes projets ca serait cool, après peux être que tu t'en souviens plus.
Merci bien.
Marsh Posté le 11-05-2010 à 16:19:24
La fonction getSubLevelsAowOfAow() du fichier /Astres/Common/DbAowLibrary.php
En gros, un ticket de help-desk peut être sous-découpé en plusieurs tickets, eux-mêmes pouvant l'être à leur tour, etc... On a donc pour un ticket, une petite arbo de tickets, chaque ticket étant stocké en BD dans une table qui contient, entre autre, leur niveau de profondeur dans l'arbo (0, 1, 2...) et l'ID vers le ticket parent.
La table contient des pleins d'arbo de tickets, une arbo pouvant être vue comme un "dossier client" (sa demande et tous les sous-découpages vers d'autres services de traitement, on appelle ça en help-desk une escalade).
Marsh Posté le 11-05-2010 à 17:06:10
rufo a écrit : Surtout pas la récursivité car bien souvent, tu ne maîtrises pas la taille de l'arbre (le plus gênant étant la profondeur) et donc, un parcours par récursivité va faire que tu vas pas arrêter d'empiler sur la pile les appels de fonctions, pile qui va finir par péter. A ça, tu rajoutes que la récursivité est une catastrophe en terme de perfs par rapport à l'itératif (ben oui, stocker sur la pile le contexte, ça a un coût en temps). Donc, je répète, surtout pas de récursivité pour un parcours d'arbre. |
C'est un poil trop définitif, comme avis, si tu veux le mien.
Là il va se faire chier à implémenter un parcours itératif alors qu'un récursif s'écrit bien plus facilement et répond peut-être très bien au besoin.
(et sinon, pour répondre un peu plus à la question, il n'y a pas de fonction mysql qui fait ça? Oracle permet de le faire en une requête... )
Marsh Posté le 11-05-2010 à 17:22:49
non, pour avoir implémenté des arbo sous mysql dans mes 2 softs, y'a pas Par contre, on peut s'en sortir si on change sa modélisation dans la bd, pour passer d'un truc genre TableArbo (ID, ......, ParentID) à d'un de ces modèles :
- modèle de "plus proches ensembles" : http://dev.mysql.com/tech-resource [...] -data.html
- modèle appelée en fr "représentation intervallaire" : http://sqlpro.developpez.com/cours/arborescence/
Malheureusement, j'ai découvert ces solutions après...
Marsh Posté le 11-05-2010 à 17:27:24
ya de l'espoir.
http://dev.mysql.com/doc/refman/5. [...] uture.html
Citation : |
Marsh Posté le 11-05-2010 à 17:42:33
J'aimerais bien savoir l'âge qu'a cette page, mais il me semble l'avoir déjà lue y'a bien longtemps (plus d'1 an)...
[hs]dans la foulée, ils auraient pu ajouter le fait qu'on puisse aliaser plus d'1 fois une table temporaire dans une requête [/hs]
Marsh Posté le 11-05-2010 à 18:59:28
Le problème c'est que toi tu stoques le level et une autre valeur dans ta base.
Moi j'ai uniquement un champs parent_id et donc je voudrais récupérer toutes les réponses filles par ordre ou le commentaire a été posté comme on le voit sur cette image par exemple.
http://3.bp.blogspot.com/_FX3RmPEl [...] mments.png
Ca me gonfle je ne sais pas comment m'y prendre.
Marsh Posté le 11-05-2010 à 19:17:15
tu fais une fonction du genre
Code :
|
le aprcours itératif, c'est bien pour optimiser, mais c'est pas aussi simple que ça à mettre en place quand meme. ET le gain me semble marginal
Marsh Posté le 11-05-2010 à 19:37:03
flo850 a écrit : tu fais une fonction du genre
le aprcours itératif, c'est bien pour optimiser, mais c'est pas aussi simple que ça à mettre en place quand meme. ET le gain me semble marginal |
Ca sous entend que je dois appeler cette fonction pour chacun de mes commentaires?
En effet quand je suis sur la page du détail d'un article, je ne sais pas ce que vaut idparent, il faut donc que j'appel cette fonction autant de fois qu'il y a de commentaires ?
Marsh Posté le 11-05-2010 à 20:11:45
tu l'appelle avec idParent a zéro
mais effectivement, tu vas l'appeler un paquet de fois ( autant que de commentaire)
Marsh Posté le 12-05-2010 à 09:29:00
masseur a écrit : Le problème c'est que toi tu stoques le level et une autre valeur dans ta base. |
Mon critère d'arrêt le level, mais c'est parce que je permets à ma fonction de pas tout récupérer l'arbo (limite dans la remontée ou dans la profondeur). Toi, ton critère d'arrêt, ben c'est quand tu ne trouves plus aucun élément à traiter. Donc tu tiens pas compte du level. Mais le principe de l'algo est le même.
Marsh Posté le 11-05-2010 à 13:00:44
Bonjour.
Dans ma table commentaire je possède un champs reply_id qui me permet de savoir si un commentaire vient en réponse à un autre commentaire.
Dans ma page il faudrait donc que j'affiche la liste des commentaires avec leur réponses (un commentaire de réponse doit venir juste en dessous de son commentaire parent)
J'ai du mal à voir comment mettre cela en place sachant qu'un commentaire peux avoir autant de réponses et qu'une réponse à une réponse peux avoir une réponse.
Ca me semble être un bouclage infini mais je dois mal m'y prendre
Affichage d'un commentaire
Si le commentaire à une réponse on l'affiche (il faut donc récupérer les commentaires fils)
Il faut ensuite tester si le commentaire fils a lui aussi eu une réponse.
etc etc
Sinon on affiche le commentaire suivant
Ca me semble être un truc sans fin, je dois rater quelque chose non ou c'est la bonne manière de procéder?
Avec un truc dans le genre j'arrive à récupérer les réponses à un post, mais du coup si une réponse a une réponse cela ne sera pas affiché.
On m'a conseillé d'utiliser la récursivité, si vous avez une idée sur quoi faire et comment faire je suis preneur.
Merci par avance
Message édité par masseur le 11-05-2010 à 13:15:51