• 2 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
راهنمائی برای نمایش دسته و زیر دسته
#1
با سلام و عرض ادب
برای بخش دسته‌ها یک تیبل درست کردم به اسم category و دسته‌ها رو توی این تیبل ذخیره می‌کنم و مشکلی نیست. حالا می‌خوام لیست دسته‌ها و زیر دسته‌ها رو نمایش بدم و مشکلم سر نمایش زیر دسته‌ها هست.
تیبل شامل فیلدهای زیر هست:
کد:
id // each category have a uniqe id
parentid // if the category is main => 0 or if the category is parent of main category => main category id
name // category name
... // other data for category like icon, slug & ...
کدی که من خودم تونستم بنویسم اینه:
کد پی‌اچ‌پی:
$db->query('SELECT * FROM `category` WHERE parentid < 1');
$cn $db->num_row();
while(
$row $db->get_assoc()):
    
$main[] = $row;
endwhile;
for(
$i 0$i $cn$i++):
    echo 
$main[$i]['name']."<br />";
    
$db->query('SELECT * FROM `category` WHERE `parentid` = "'.$main[$i]['id'].'"');
    while(
$sub $db->get_assoc()):
        echo 
'-- '.$sub['name']."<br />";
    endwhile;
endfor;
$db->free(); 

ولی ظاهر کد زیاد به دلم نمی‌شینه و فکر می‌کنم یا بهتره بگم مطمئنم از نظر اصول، سرعت، کفیت و دیگر مواردی که باید توی کد نویسی رعایت بشه، این کد زیاد خوب نباشه. مثلا اگر 40 تا دسته داشته باشیم توی کد بالا 40 بار به دیتابیس وصل می‌شه تا ببینه زیر دسته داره یانه و نمایش بده.Undecided

پ.ن. امیدوارم توی فروم درست تاپیک زده باشم، بنظرم این یک تکنیک هست برای همین توی فروم کدنویسی ارسال نکردم. اگر غیر از این هست از ادمین و مدیران محترم عذر می‌خوام.Blush

از راهنمائی شما ممنونمHeart
  پاسخ
تشکر شده توسط :
#2
کد پی‌اچ‌پی:
$db->query('SELECT * FROM `category` ORDER BY `parentid` ASC;');
$cn$db->num_row();
$category= array();

while(
$row $db->get_assoc()):
    
$category[$row['parentid']][]= &$row;
endwhile;

function 
showCat($cat)
{
    global 
$category;
    echo(
'<ul>');

    foreach(
$cat as $k=>&$v)
    {
        echo(
'<li>');
        echo(
$v['name']);
        if(
is_array($category[$v['id']])):
            
showCat(&$category[$v['id']]);
        endif;
        echo(
'</li>');
    }

    echo(
'</ul>');
}

showCat(&$category[0]); 
  پاسخ
تشکر شده توسط : Y.P.Y oia Daniel Alimokhlesi HiddeN payam bitanaz smhnaji
#3
پست رو ویرایش کردم آخرش یادم رفت تابع رو صدا بزنم
  پاسخ
تشکر شده توسط :
#4
(۱۳۸۸ مهر ۲۸, ۰۵:۱۴ ب.ظ)admin نوشته: پست رو ویرایش کردم آخرش یادم رفت تابع رو صدا بزنم

از لطف و توجه شما ممنونم، چون من تازه شروع کردم و در حال یادگیری هستم کدی که شما زحمتش رو کشیدین تفسیر می‌کنم، اگه مشکلی بود ممنون می‌شم بگین
سطر 1: کل رکوردهای تیبل رو به ترتیب parentid سلکت می‌کنیم.
سطر 2: فکر کنم از کد من جا مونده و در کد شما مورد استفاده نداره.
سطر 3: متغییر category رو بصورت آرایه تعریف می‌کنیم.
سطر 4:‌ توسط حلقه هر یک از رکوردها رو توی متغییر row ذخیره می‌کنیم
سطر 5: آرایه category که در سطر 3 تعریف کردیم با اندیکس prentid مقدار متغییر row مقدار دهی می‌کنیم
سطر 6: انتهای حلقه
سطر 7: تعریف فانکشن که یک آرگامنت می‌گیره (تا جائی که من متوجه شدم با این آرگامنت دسته‌هائی که parentid اون 0 هست رو انتخاب می‌کنه برای حلقه foreach)
سطر 8: ایجاد دسترسی به آرایه category در داخل فانکشن
سطر 9: ...
سطر 10: حلقه foreach دسته‌ای که parentid اون 0 هست می‌گیره
سطر 11: ...
سطر 12: نمایش دسته اصلی (parentid=0)
سطر 13: چک می‌کنه که آیا category با این ای‌دی آرایه هست یانه که اگر بود سطر14
سطر 14: دوباره فانکشن رو صدا می‌کنه و آرگامنت اون رو دسته در حال بحث حلقه رو قرار می‌ده
سطور بعدی ...

البته این کد یه مشکلی داره و خطا می‌ده. یعنی دسته‌ها رو نشون می‌ده و در زیرش این خطا: ...Notice: Undefined index: 1 in رو می‌ده.

برداشتی که من از این کد کردم اینه که ما ابتدای کار کل رکوردها رو می‌ریزیم توی آرایه و در بقیه مراحل روی آرایه پردازش رو انجام می‌دیم و دیگه به دیتابیس کاری نداریم.

بازهم ممنون از توجه و راهنمائی‌تونHeart
  پاسخ
تشکر شده توسط :
#5
من این رو نتونستم تست کنم یعنی وقت نداشتم
درسته
کار اشتباه شما این هست که توی یه حلقه دارید دوباره یه کوئری می نویسید. در حالی که می‌تونید اون رو توی کوئری قبلی داشته باشید و با یه کمی ذوق و سلیقه نتایح رو نمایش بدین
  پاسخ
تشکر شده توسط : oia aligilani1986


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان