הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   [PHP] קטגוריות רקורסיביות (?) (https://hosts.co.il/forums/showthread.php?t=39497)

sUP 08-02-07 16:05

[PHP] קטגוריות רקורסיביות (?)
 
הי :-D

יש לי עבודה קטנה על קטגוריות רקורסיביות,
כך שלדוגמא בכל קטגוריה \ תת קטגוריה \ תת-תת-תת קטגוריה יוכלו להוסיף פריט מסויים

אני קצת נתקע עם התכנות של זה

אשמח אם תוכלו לעזור לי |קורץ|

תודה

BlueNosE 08-02-07 18:19

קטגוריות תמיד יש.
לכן נוסיף טבלה שתיקרא Cats.
נחלק את הטבלה Cats בצורה הבאה:
ID - Name - Description - cID
ID צריך להיות PRIMARY וכל השיט.
Name הוא שם הקטגוריה.
Description הוא תיאור הקטגוריה.
cID צריך לקבל ערך 0. אם הוא לא 0, הערך שיקבל יהיה הקטגוריה שמעליו (בעצם אם הוא לא 0 הוא לא קטגוריה אלא סאב קטגוריה).

בתוכם יוכלו להיות או אייטמים או סאב קטגוריות.
לכן ניצור טבלה חדשה, Items.
את Items נחלק כך:
ID - Name - Description - cID
ID שוב יהיה PRIMARY עם מספור אוטומטי.
Name שם, Description תיאור..
עכשיו cID זה הקטגוריה / הסאב.

שליפה:
PHP קוד:

function getinto($Cat)
{
$qry = @mysql_query ("SELECT * FROM Cats WHERE ID={$Cat}");
$q mysql_fetch_assoc ($qry);// או אריי, איך שבא לך
echo "details here.. {$q['Name']}{$q['Description']}";
$qry = @mysql_query ("SELECT * FROM Cats WHERE cID={$Cat}");
if (@
mysql_num_rows ($qry) > 0)
while (
$c mysql_fetch_array ($qry))
{
echo 
"{$c['Name']} - {$c['Description']}";
getinto($c['ID']);
}
$qry = @mysql_query ("SELECT * FROM Items WHERE cID={$Cat}");
if (@
mysql_num_rows ($qry) > 0)
while (
$i mysql_fetch_array ($qry))
echo 
"{$i['Name']} - {$i['Description']}";
}

$qry mysql_query ("SELECT * FROM Cats WHERE cID=0");
while (
$q mysql_fetch_array ($qry))
{
echo 
"{$q['Name']} - קטגוריה ראשית";
getinto($q['ID']);


נסה.. בוא נגיד שזה הומצא בתיבת טקסט זו..

nevo 08-02-07 18:27

לדעתי אפשר לעשות את זה בטבלה אחת, יותר טוב :)
פשוט תוסיף עוד שדה
c_type
שנגיד 1 = קטגוריה || 2 = סאב קטגוריה || 3 = סאב סאב... וכו'....

ali_napso 08-02-07 18:27

בעיקרון אתה עושה שלכל קטגוריה יהיה קישוריות מסויימת לקטגוריה שמעליו(מן הסתם הID שלו) ובשליפה אתה בודק אם לקטגוריה שמעליו יש עוד קטגוריה מעליו וכך הלאה עד שאתה מגיע לראשי


ציטוט:

נכתב במקור על ידי nevo (פרסם 420124)
לדעתי אפשר לעשות את זה בטבלה אחת, יותר טוב :)
פשוט תוסיף עוד שדה
c_type
שנגיד 1 = קטגוריה || 2 = סאב קטגוריה || 3 = סאב סאב... וכו'....

אבל שאתה מוסיף קטגוריה אתה תצטרך לבדוק כל פעם מחדש כמה "סאבים" יש וזה יהיה סתם ביזבוז

sUP 08-02-07 18:43

בחלה :)
תודה עומר

BlueNosE 08-02-07 18:46

ציטוט:

נכתב במקור על ידי sUP (פרסם 420137)
בחלה :)
תודה עומר

בכיף :)
הצלחת, הכל היה ברור?

Level-Serv 08-02-07 18:47

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

אם אתה רוצה את הפונקציה צור קשר ואני אתן לך...

The Crow 08-02-07 18:50

BlueNosE, הקוד שלך ממש ממש ממש לא יעיל.
4 שאליתות + 3 לולאות שקוראות לעצמן...
ממש לא מומלץ.

בכל אופן, הטבלה של הקטגוריות צריכה להראות כך:
קוד:

id | parent_id | title
אם זו קטגוריה ראשית, אתה שם 0 ב parent_id.

בשליפה של הקטגוריות:
1. קודם כל שלוף את כל הקטגוריות לתוך מערך
2. קרא לפונקציה מסוימת, נקרא לה getCats והפונקציה הזאת תקבל 2 פרמטרים: catArr, parent_id
catArr - מערך עם כל הקטגוריות שיצרת בשלב 1
parent_id - כדי להציג את כל הקטגוריות הוא צריך להיות 0

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

הנה דוגמא של הפונקציה:
PHP קוד:

function getCats($arr$parent 0)
{
   foreach (
$arr as $val)
   {
        if (
$val['parent_id'] == $parent)
        {
           echo 
$val['title'];
           
getCats($arr$val['id']);
        }
   }


מקווה שהכל מובן.
בהצלחה :)

BlueNosE 08-02-07 18:54

ציטוט:

נכתב במקור על ידי The Crow (פרסם 420144)
BlueNosE, הקוד שלך ממש ממש ממש לא יעיל.
4 שאליתות + 3 לולאות שקוראות לעצמן...
ממש לא מומלץ.

בכל אופן, הטבלה של הקטגוריות צריכה להראות כך:
קוד:

id | parent_id | title
אם זו קטגוריה ראשית, אתה שם 0 ב parent_id.

בשליפה של הקטגוריות:
1. קודם כל שלוף את כל הקטגוריות לתוך מערך
2. קרא לפונקציה מסוימת, נקרא לה getCats והפונקציה הזאת תקבל 2 פרמטרים: catArr, parent_id
catArr - מערך עם כל הקטגוריות שיצרת בשלב 1
parent_id - כדי להציג את כל הקטגוריות הוא צריך להיות 0

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

הנה דוגמא של הפונקציה:
PHP קוד:

function getCats($arr$parent 0)
{
   foreach (
$arr as $val)
   {
        if (
$val['parent_id'] == $parent)
        {
           echo 
$val['title'];
           
getCats($arr$val['id']);
        }
   }


מקווה שהכל מובן.
בהצלחה :)

ולהריץ לולאת FOREACH בכל בדיקה לא תיקח יותר משאבים?
מילא אם היית עושה continue בין לבין..

חוץ מזה, הוא ביקש הצגת משהו בתוך הקטגוריה לא?..

The Crow 08-02-07 18:58

ציטוט:

נכתב במקור על ידי BlueNosE (פרסם 420147)
ולהריץ לולאת FOREACH בכל בדיקה לא תיקח יותר משאבים?
מילא אם היית עושה continue בין לבין..

חוץ מזה, הוא ביקש הצגת משהו בתוך הקטגוריה לא?..

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


כל הזמנים הם GMT +2. הזמן כעת הוא 03:58.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ