שלח תשובה

זירת השאלות

917
צפיות
21
תשובות

פונקציה רקורסיבית

,‏ 6 בפברואר, 2006

אני בונה פורום-עץ (כמו זה   ), ואני רוצה לעשות לולאה רקורסיבית בצד שרת(php) . כדי שלא יהיו הרבה חיבורים ל-mysql אני עושה משפט אחד
שמוציא את כל ההועדות של הנושא שנבחר, ואז מכניס את התוצאה לתוך מערך שמורכב ממערכים.

עכשיו אני תקוע.אין לי שום דרך לדעת כמה אני "בתוך" העץ (בן, נכד, נין..), אז חשבתי לעשות פונקציה שקודם תסדר את המערך שלי לפי הסדר שהוא צריך להיות מוצג וגם תוסיף עוד פרמטר לתת-מערך שיראה כמה אני "בתוך העץ". אפשר לעשות כזה דבר בכלל? ככה כדאי לעשות את זה?

תגיות:

21 תשובות

  1. GreenBerret הגיב:

    איך?
    איפה בדיוק נכנס עניין הרקורסיביות?

    בפונקציה עצמה? בשאילתה אל השרת?

  2. בגלל שאני לא רוצה
    לגשת הרבה פעמים לmysql אני עושה פעם אחת select לכל השירשור שנבחר.
    הפונקציה הרקורסיבית היא זאת שמקבלת מערך של כל הselect -מסדרת אותו לפי סדר הצגה ומוסיפה את הפרמטר של "עומק".

    אם אתה חושב על דרך אחרת אני אשמח מאוד לשמוע (כל עוד נשארת גישה אחת לmysql). אם אתה חושב שהרעיון שלי נכון אני אשמח אם תעזור לי לממש אותו רעיונית  

  3. אוריקס הגיב:

    הממ
    אתה לא צריך לדעת את זה  ברמת הקוד, תן ל CSS שלך לעבוד:


    <div style = "padding: 0px">text
            <div style = "padding: 10px;">text
                      <div style = "padding: 20px;">text</div>
             </div>
    </div>

  4. נכון,אבל
    אני צריך לעבור מספר שלבים:
    1. סדר_מערך – שיסדר את המערך שהתקבל מהשליפה. עזרה באיך לבנות פונקציה כזאת תתקבל בברכה  
    2. עבור כל האיברים במערך
    2.1 סגור/פתח div (ויכול להיות שצריך לסגור 5-6-7 בבת אחת!)
    2.2 הצג פרטים

    תקן אותי אם אני טועה, מאוד יכול להיות שהתבלבלתי
    לגמרי…

  5. אוריקס הגיב:

    לא ממש הבנתי אותך
    אבל כמה דברים:
    1. קרא את המאמר באתר על יצירת הפורום הרקורסיבי, הוא מדבר בדיוק על מה שאתה מדבר
    2. אם אתה עדיין רוצה לפתור את זה ברמת האלגוריתם:


    Sub Stam(ByVal x, ByVal Level)
          Randomize
          Stam(rnd(), Level + 1)
    End Sub
    Stam(1,0)

    המשתנה Level מראה לך באיזו רמה אתה. כמובן שהפונקציה לא כוללת תנאי יציאה (הרקורסיה תמשך לעד) והיא סתמית, אבל אני מניח שהבנת.

  6. GreenBerret הגיב:

    פורום רקורסיבי
    זו אולי השיטה הכי דבילית שיש לבנות פורום משורשר.
    יש שיטות הרבה יותר טובות שתופסות הרבה פחות משאבים.

  7. אז למה שלא
    תסביר לי קצת מה יהיה פחות דבילי?פעם ראשונה שאני מתמודד עם פונקציה רקורסיבית אז טיפה קשה לי לתפוס את החשיבה

  8. הקוד שלי יוצר לולאה אינסופית

    function showtree($res, $j, $parent) {
    echo "<div style="padding-right:20px">";
    // הדפסה של התגובה
    for ($i=1; $i<sizeof($res); $i++) {
      if ($res[$i]['parent']==$parent)
        showtree($res, $i, $res[$i]['parent']);
    echo "</div>";
    }
    זה אמור להציג שירשור אחד (לא ניסיתי ולא תיכננתי את זה שיעבוד על יותר).
    אני הזנתי שירשור כזה:
    1. אב
    1.1 בן ראשון
    1.1.1 נכד ראשון
    1.2 בן שני
    הפלט שהפונקציה הראתה היא:
    אב
     &nbspבן ראשון
        נכד ראשון
          נכד ראשון
            נכד ראשון
    וכן הלאה, חוזר על נכד ראשון לעומק.אני בטוח שזה
    בסך הכל משהו קטן שלא שמתי לב,אבל אני לא מצליח לחשוב על הבעיה.

  9. תיקון
    מצטער על ההודעה הנוספת (למה אי אפשר לערוך?)

    עשיתי כמה שטויות בפונקציה הקודמת. עכשיו אני יותר קרוב
    לאיך שהפונקציה צריכה להיות,אבל חלק מהתגובות מופיעות כמה פעמים.
    הזנתי את אותו שירשור שבהודעה הקודמת, והפונקציה שלי

    function showtree($res, $from, $parent) {
      for ($i=$from; $i<sizeof($res); $i++) {
      echo "<div style="padding-right:20px">";
      // הדפסה של התגובה
      for ($j=$i+1; $i<sizeof($res); $j++) {
        if ($res[$j]['parent']==$res[$i]['id'])
          showtree($res, $j, $res[$i]['id']);
      echo "</div>";
      }
    }

    התוצאה די קרובה:
    בן ראשון
      נכד
      בן שלישי
    בן שני
    נכד
    בן שלישי.

    מקווה שתוכלו לעזור  

  10. GreenBerret הגיב:

    אין לי בעיה
    אבל תצטרך לשנות את כל מסד הנתונים שלך.

  11. אוקי
    אני לא מבטיח כלום תצטרך לשכנע אותי שבאמת כדאי לי לשנות את המבנה של
    המסד נתונים.אבל הפונקציה די קרובה להציג את העץ,לא?

  12. זהר פלד הגיב:

    ממש לא נכון.
    ניתן פשוט להעביר את כל תהליך הרקורסיה ופריסת ההודעות לצד הלקוח, מה שמייעל את המערכת במאות אחוזים.

  13. אחרי שאני אצליח בצד-שרת
    להציג את ההודעות- זאת תהיה כבר בעיה קטנה מאוד להעביר את הפריסה לצד לקוח.בינתיים אני רוצה לנסות את זה
    בצד שרת.אבל מה הטעות שלי? האם ה-IF לא נכון, או שמשהו לא מדויק בלולאת FOR הגדולה? אה, והרבה תודה!

  14. GreenBerret הגיב:

    אתה צודק
    אבל יש שיטות תכנון, שבשאילתה אחת אתה יכול לקבל את כל הנתונים מסודרים בשרשור שאתה רוצה.

  15. אוריקס הגיב:

    כולנו מכירים את השיטות המזעזעות
    האלה, ותאמין לי שאף אחת לא יותר יעילה מהמבנה הרקורסיבי, שלא מחייב רקורסיה בכלל.

  16. GreenBerret הגיב:

    אני לא מדבר על
    שאילתות "משוכללות" ומסובכות.
    אני מדבר על תכנון של מסד הנתונים.

  17. Admini הגיב:

    השיטות המזעזעות הללו עובדות לא רע
    זה לא שהן מתאימות בכל מצב, אבל אני מפעיל הרבה מערכות שעובדות ככה ללא תקלות.

    ואגב,
    אפשר להשתמש שם בשדה מספרי במקום שדה טקסט.

  18. זהר פלד הגיב:

    דוקא מסד הנתונים בנוי בצורה הכי
    פשוטה, טבעית, ונכונה בפורום "רקורסיבי"…

  19. GreenBerret הגיב:

    זה יחסית נכון
    אבל זה תלוי איך אתה מתכנן את מסד הנתונים.
    אם הוא לפי, מה שנקרא, חוקי הנירמול, אז אין בעיה עם זה.

  20. אנא הסבר נמק והבא דוגמאות
    לא ממש עוזר כל הדיבורים באויר   על מה אתה מדבר?

שלח תשובה