לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

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



  #1  
ישן 26-08-2006, 19:34
  Depression Depression אינו מחובר  
 
חבר מתאריך: 07.08.03
הודעות: 408
|PHP&MySQL| יעול פוקנציה

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

הסבר כללי על איך שהקטגוריות אצלי בנויות :
יש לי 2 שדות שצריך להתייחס אליהם, ID וPARENT.
כאשר אני יוצר קטגוריה, היא מקבלת ID יחודי.
כאשר הקטגוריה ראשית, היא מקבלת PARENT = 0.
כאשר אני יוצר תת קטגוריה לקטגוריה מסויימת, התת-קטגוריה מקבלת בPARENT, את הID של קטגורית האב.
למשל קטגוריה ראשית:
ID = 1, PARENT = 0.
ID = 2, PARENT = 0.
ID = 3, PARENT = 0.
עכשיו אני יוצר לקטגוריה הראשונה תת-קטגוריה:
ID = 4, PARENT = 1.


הפונקציה שלי פעולת ככה:
היא שולפת את כל הקטגוריות הראשיות, כלומר כל אלו עם PARENT=0,
אחר כך עבור כל תוצאה היא מוצאת את כל הילדים של אותה קטגוריה.
למשל אם קיבלה את התוצאות האלו:
ID = 1, PARENT = 0.
ID = 2, PARENT = 0.
ID = 3, PARENT = 0.
היא תריץ 3 שאילתות נפרדות עבור כל אחת מהתוצאות.
פה הבעיה שלי, את זה אני רוצה לייעל.

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

תודה לכל העוזרים, הבעיה הזאת ממש חשובה לי.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #3  
ישן 26-08-2006, 20:00
  Depression Depression אינו מחובר  
 
חבר מתאריך: 07.08.03
הודעות: 408
בתגובה להודעה מספר 2 שנכתבה על ידי eXeCuT3 שמתחילה ב "אני חושב שזה נדון בפורום כמה..."

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

בקירון לפני שענית עשיתי משהו דומה, שחילקתי ל2 מערכים מערך ראשון יכיל את כל הקטגוריות הראשיות הID והשם שלה, ומערך שני את כל הילדים ID, שם וPARENT.
אבל לא הצלחתי לעשות פונקציה רקורסיבית כמו שאתה מדבר עליה.
חשבתי להשתמש בזה:
http://il.php.net/manual/en/function.array-keys.php
כלומר עבור כל תוצאה של מערך הפונקציות הראשיות, להשתמש בarray_keys על המערך של התת-קטגוריות ולהדפיס אותם.
*הבעיה היחידה היא שהפונקציה בודקת במערך דו מימדי את כל השדות, ולא שדה ספציפי,
אם יש פיתרון לזה אני אשמח לדעת עליו.

או אם אני אלך בדרך שלך, אני אצור מערך גדול של כל הקטגוריות, אני הפעיל את array_keys על המערך תחילה על הערך 0, אז אני אקבל את כל הקטגוריות הראשיות, בתנאי שלא נתתי שם '0' או הסדר של הקטגורית שלי הוא לא '0' וכו'..
אז עבור כל תוצאה אני אשתמש שוב בarray_keys הפעם עם הID של הקטגוריה.
*אני גם אצטרך להוסיף תנאי של אם הparent לא 0, כי array_keys עוברת על כל השדות,
ואני אקבל גם כתוצאה את הקטגוריה הראשית עצמה.

אני מקווה שיש פה אנשים עם רעיונות :]

נערך לאחרונה ע"י Depression בתאריך 26-08-2006 בשעה 20:15.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 27-08-2006, 01:20
  Depression Depression אינו מחובר  
 
חבר מתאריך: 07.08.03
הודעות: 408
.
בתגובה להודעה מספר 4 שנכתבה על ידי eXeCuT3 שמתחילה ב "הנה משהו שאני עשיתי,..."

לא כל כך הבנתי את הפונקציה שלך, הבנתי שdeep ייצג מבחינת ריקורסיה את הרווח , כך שזה יראה במעיין שירשור.
tid מיצג את הID, כלומר את הקטגוריות\תגובות ראשיות.

עכשיו, אתה לא אמור לעשות את הבדיקה:
קוד PHP:
 if (is_array($comments[0])) show_comment_tree(); 

עבור כל תגובה, כך למעשה תקבל שירשור לכל תגובה?.
ובמקום comments[0] לא אמורים להכניס משתנה שייצג את התגובה הראשית שכרגע נבדקת?.

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

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

אגב,
תודה רבה לך.

נערך לאחרונה ע"י Depression בתאריך 27-08-2006 בשעה 01:29.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #6  
ישן 27-08-2006, 15:29
  eXeCuT3 eXeCuT3 אינו מחובר  
 
חבר מתאריך: 30.06.06
הודעות: 185
בתגובה להודעה מספר 5 שנכתבה על ידי Depression שמתחילה ב "."

tid = התגובה שזה הוגב לה
וכן, אתה צודק, הורדתי מתוך הלולאה חלק שלא הייתי צריך להוריד...
קוד PHP:
 if (is_array($comments[$cid])) show_comment_tree($cid$deep+1); 


יש את זה בתוך הלולאת foreach ...
$comment מקבל מערך עם מידע על כל תגובה
הנה הקוד המלא

קוד PHP:
 function show_comment_tree ($tid=0$deep=0) {
        global 
$comments$align;
        echo 
"<div style=\"padding-$align: ".($deep 20)."px\">\n";
        foreach (
$comments[$tid] as $comment) {
            list (
$cid$uid, ......) = $comment;
            ....
            if (
is_array($comments[$cid])) show_comment_tree($cid$deep+1);
        }
        echo 
"</div>\n";
    }
    if (
is_array($comments[0])) show_comment_tree(); 

$comments = מערך שמכיל את כל המידע.. בנוי בצורה שהראתי מקודם
קוד PHP:
 $comments[PARENT_ID][]=array(comment iduser id, .....); 


אצלי ה parent id נקרא tid

מקווה שהבנת..
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #7  
ישן 27-08-2006, 02:18
  ישראל K ישראל K אינו מחובר  
 
חבר מתאריך: 25.08.03
הודעות: 9,114
אני חושב שאתם טועים בגישה
בתגובה להודעה מספר 1 שנכתבה על ידי Depression שמתחילה ב "|PHP&MySQL| יעול פוקנציה"

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

אמנם אין לי כרגע את הפתרון לשאילתה המתאימה (יש לי כיוון אך זה נראה לי מסורבל מדי לכן לא בדקתי זאת עדיין), אך לפחות משהו שיחסוך את הסירבול אליו נקלעתם יש לי.
ראשית תגיש שאילתה פשוטה ביותר:
קוד:
SELECT * FROM table ORDER BY parent

השאילתה תחזיר את הקטגוריות משנה מסודרות כשברא הרשימה כל הקטגוריות הראשיות. לדוגמה:
קוד:
1 0 comp 2 0 news 6 0 travel 4 1 tech 5 1 web 3 2 israel

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

קוד לדוגמה:
קוד PHP:
 $q mysql_query('SELECT * FROM table ORDER BY parent');
while(
$cat mysql_fetch_assoc($q))
{
    if(
$cat['parent'] == 0)
        
$cats[$cat['id']] = $cat['name'];
    else
        
$cats[$cat['parent']]['id'] = $cat['name'];


נערך לאחרונה ע"י ישראל K בתאריך 27-08-2006 בשעה 02:22.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 27-08-2006, 18:41
  Depression Depression אינו מחובר  
 
חבר מתאריך: 07.08.03
הודעות: 408
בתגובה להודעה מספר 7 שנכתבה על ידי ישראל K שמתחילה ב "אני חושב שאתם טועים בגישה"

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

אני משתמש בforeach על המערך הראשון - המכיל קטגוריות ראשיות,
ובתוך הלולאה הזו אני מוסיף עוד fodeach, הפעם במקום לציין רק את שם המערך של התת-קטגוריות,
אני מוסיף לו את השדה ['id'], אבל משום מה זה לא עובד, למשל:
קוד PHP:
 foreach ($ogen_array as $result_products)
{
    
$C_ID $result_products['C_ID'];
    foreach (
$regul_array['$C_ID'] as $regular_products)
    {
        
//Bla..
    
}


למעשה ה$C_ID הוא הID של הקטגוריה הראשית מהלולאה החיצונית יותר.

זה הקוד המלא שלי, אני מקווה שתבין:
C_Products = 3 - קטגוריות ראשיות
C_Products = 4 - תת-קטגוריות
קוד PHP:
 while ($prod mysql_fetch_assoc($result))
            {
                if (
$prod['C_Products'] == 3)
                {
                    
$ogen_array[$prod ['C_ID']]['C_ID'] = $prod['C_ID'];
                    
$ogen_array[$prod ['C_ID']]['C_Name'] = $prod['C_Name'];
                }
                elseif(
$prod['C_Products'] == 4)
                {
                    
$regul_array[$prod ['C_ParentID']][$prod ['C_ID']]['C_ID'] = $prod['C_ID'];
                    
$regul_array[$prod ['C_ParentID']][$prod ['C_ID']]['C_Name'] = $prod['C_Name'];
                }
            }

            foreach (
$ogen_array as $result_products)
            {
                
$C_ID $result_products['C_ID'];
                
$NAME $result_products['C_Name'];
                echo 
"$C_ID $NAME<br \>";
                
                foreach (
$regul_array['$C_ID'] as $regular_products)
                {
                    
$C_ID $regular_products['C_ID'];
                    
$NAME $regular_products['C_Name'];
                    echo 
"$C_ID $NAME<br \>";
                }
            } 

השגיאה שאני מקבל:
Warning: Invalid argument supplied for foreach() in /home/mamboheb/domains/mamboheb.com/public_html/sell/test/vtest.php on line 132
http://mamboheb.com/sell/test/vtest.php?C_ID=108

נערך לאחרונה ע"י Depression בתאריך 27-08-2006 בשעה 19:00.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #14  
ישן 28-08-2006, 21:38
  Depression Depression אינו מחובר  
 
חבר מתאריך: 07.08.03
הודעות: 408
בתגובה להודעה מספר 11 שנכתבה על ידי ישראל K שמתחילה ב "תיצור קובץ HTML של 3 קטגוריות..."

אני רוצה פונקציה ממש פשוטה,
אני אשלוף את כל המידע מהמסד כמו שאתה עשית בשאילתה הראשונה,
הפונקציה תקבל 2 פרמטרים, הראשון הוא ID, כלומר הID הראשוני שממנו הפונקציה תתחיל.
נניח שניתן לפונקציה את הערך 0:
היא תשלוף את כל הנתונים מהמערך שיש להם בParent - 0, ותציג אותם, אז עבור כל תוצאה
היא תקח את הID שלה ותחזור שוב על עצמה בריקורסיה, הפעם במקום ה0 שהצבנו בהתחלה,
הפונקציה תציב את הID של הקטגוריה - זו למעשה ריקורסיה שתציג את כל הקטגוריות.

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

*בעיקרון יספיק לי הרעיון הבסיסי של איך לשלוף אתה מידע המתאים לי מהמערך בכל פעם, כלומר איך אני יוכל לקחת את כל הקטגוריות שההורה שלהם הוא X ולהציג אותם.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #15  
ישן 28-08-2006, 21:59
  ישראל K ישראל K אינו מחובר  
 
חבר מתאריך: 25.08.03
הודעות: 9,114
בתגובה להודעה מספר 14 שנכתבה על ידי Depression שמתחילה ב "אני רוצה פונקציה ממש..."

ציטוט:
במקור נכתב על ידי Depression
אני רוצה פונקציה ממש פשוטה...


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

תריץ את הקוד הבא ותתבונך בתוצאות:
קוד PHP:
 <style type="text/css">
div.cat_main {
    
margin-top8px;
    
color#9F6363;
}

div.cat_sub {
    
margin-right20px;
    
color#CFA8A8;
}
</
style>


<?
php

// DB Connection

$q mysql_query('SELECT * FROM table ORDER BY parent');
while(
$cat mysql_fetch_assoc($q))
{
    if(
$cat['parent'] == 0)
        
$cats[$cat['id']]['main'] = $cat['name'];
    else
        
$cats[$cat['parent']]['id'] = $cat['name'];
}

foreach(
$cats as $cSubs)
{
    foreach(
$cSubs as $k=>$name)
    {
        if(
$k == 'main')
            echo 
'<div class="cat_main">'.$name.'</div>';
        else
            echo 
'<div class="cat_sub">'.$name.'</div>';
    }
}

?> 
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #16  
ישן 28-08-2006, 22:13
  Depression Depression אינו מחובר  
 
חבר מתאריך: 07.08.03
הודעות: 408
בתגובה להודעה מספר 15 שנכתבה על ידי ישראל K שמתחילה ב "[QUOTE=Depression]אני רוצה..."

לא כל כך הבנתי מה כתבת לי שם, אני נורא מצטער.
תוכל להסביר לי למה עשית שם foreach ומה אתה מקבל ב$k=>$name בבקשה?

ממה שהבנתי, מה שכתבת לא כל כך יעיל עבורי, אני לא יכל לקבל תוצאות שהם משורשרות לעומק 3.

אני אפשט את מה שאמרת למשהו פשוט ביותר.
אני שולף את הנתונים המתאימים ויוצר מהם מערך אחד ויחיד,
הKEY של המערך יהיה הID היחודי של כל קטגוריה\תוצאה, לכל תוצאה יהיה איבר בשם parent שיכיל את הID של ההורה שלו.
בנוסף יהיה במערך גם שם לכל קטגוריה, לדוגמא:
קוד PHP:
 $array[id][parent];
$array[id][name]; 

(אם אתה חושב שהמערך שאתה בנית טוב ונח יותר, נשתנמש בשלך, פשוט לפי הבנתי המערך שלי נח ומובן יותר)
נניח שיהיו עוד הרבה תוצאות, אך כל תוצאה תהיה לה id שונה במערך.
איך אני יכל לשלוף את כל התוצאות שהparent שלהם הוא X ולהדפיס אותם?.

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

נערך לאחרונה ע"י Depression בתאריך 28-08-2006 בשעה 22:34.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #20  
ישן 29-08-2006, 23:13
  Depression Depression אינו מחובר  
 
חבר מתאריך: 07.08.03
הודעות: 408
.
בתגובה להודעה מספר 1 שנכתבה על ידי Depression שמתחילה ב "|PHP&MySQL| יעול פוקנציה"

טוב חברים יקרים, פתרתי את הבעיה, הינה הפיתרון+תוספות JS, הינה העמוד:
(תצורת העץ)
http://mamboheb.com/sell/test/vtest.php?C_ID=108
הינה הסורס של הפונקציה בלבד!:

אני אסביר את השאילת שלי, שיהיה לכם יותר קל להבין,
$Var_P_Parent מייצג את הC_ID שמתקבל מהכתובת,
השדה C_Root הוא שדה 'היסוטריה', כלומר שדה אשר מכיל את כל ההורים של הקטגוריה בסדר היררכי.
כלומר הID של כל הורה כתוב שם ומופרד בפסיקים, למשל הC_Root הזה:
0,1,30,43
אומר שהקטגוריה הספציפית הזו היא בת של קטגוריה ID 43, וקטגוריה 43 היא בת של קטגוריה 30 וכו'...

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

בנוסף יש את התנאי C_Products >= '3'
התנאי הזה אומר שאני שולף קטגוריות ברמה 3 ומעלה, כלומר לא קטגוריות ראשיות, ולא תת קטגוריות אלה תת-תת-קטגוריה.

*כל אחד יכל לשלוף שאילת בדרך שלו, כל עוד יהיה שדה של C_ParentID שיכיל את הID של ההורה,
ושדה של ID שיכיל את הID היחודי של הקטגוריה, ובשביל נוחות C_Name שיכיל את השם של הקטגוריה.
מזה ניצור מערך ונשתמש בריקורסיה להציג את המידע
קוד PHP:
 <a href="javascript:ddtreemenu.flatten('treemenu1', 'expand')">Expand All</a> | <a href="javascript:ddtreemenu.flatten('treemenu1', 'contact')">Contact All</a>
<
ul id="treemenu1" class="treeview">
<?
php
        $query 
"SELECT * FROM categories WHERE C_Root LIKE '%,$Var_P_Parent%' AND C_Products >= '3' ORDER BY C_Order";
        
        
/*
            Used to select only filters.
            $query = "SELECT * FROM categories WHERE C_Root LIKE '%,$Var_P_Parent%' AND C_Products >= '3' ORDER BY C_Order";

            Used to select ALL cats.
            $query = "SELECT * FROM categories WHERE C_Root LIKE '%$Var_P_Parent%' ORDER BY C_Order";
        */
        
$result mysql_query($query,$database->connection);
        
        while(
$cat mysql_fetch_assoc($result)) //Create the array from the query.
        
{
            
$myCatArray[$cat['C_ParentID']][] = Array($cat['C_ID'],$cat['C_Name']);
        }
        
        
/*     
            Function that show all categorys by there order
            and there sub categorys - NO LIMIT OF SUB CATEGORYS!.
            
            INPUT - Array of categorys, parent id as Key.
            OUTPUT - The categorys like tree.
            
            By - Eldad Yamin
            Date - 29/08/2006
         */
        
        //Show cats by threding.
        
function display_cats($C_ID,$deep) { 
            global 
$myCatArray//Array of categorys.
        
            
foreach ($myCatArray[$C_ID] as $cat) {                                                         
    
                for(
$i=0$i<$deep$i++)
                {
                    echo 
"\t";
                }
                
                echo 
"<li>ID: $cat[0], Name: $cat[1]";
                if (
is_array($myCatArray[$cat['0']])) //Check if for the given category have and sub cats.
                
{    
                    echo 
"\n\t<ul>\n";
                    
display_cats($cat['0'], $deep+1);
                    echo 
"\t</ul>\n";
                }
                echo 
"</li>\n";
            } 
        } 
        
        
display_cats($Var_P_Parent,0);

?>
</ul>

<script type="text/javascript">


ddtreemenu.createTree("treemenu1", false)

</script> 

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

נערך לאחרונה ע"י Depression בתאריך 29-08-2006 בשעה 23:26.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

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

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 16:23

הדף נוצר ב 0.11 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר