سلام
یکی از بچه های همین انجمن دنبال پیمایش درخت و دسته بندی سلسله مراتبی بود، لذا این کد رو اینجا می گذارم برای استفاده سایرین.
کد زیر به جای کوئری های مداوم برای واکشی زیردسته ها از DB، یکبار تمام رکوردها رو از DB واکشی می کنه و پیمایش زیرمجموعه ها رو در سمت PHP انجام میده که باعث میشه حتی در رکوردهای بالا، بهترین کارایی رو داشته باشیم.
نکات:
- داده ها به جای DB، به صورت آرایه هست که به راحتی میشه کد واکشی از DB رو بجاش گذاشت.
- یک فیلد اضافی برای بهبود سرعت به نام hasChild وجود داره، که منظور اینه که آیا این رکورد زیرمجموعه داره یا نه، که با یک جوین SQL میشه درش آورد.(همینطور می شه بجای این فیلد با PHP یک سرچ داخل آرایه ها زد که بگمانم کندتر باشه از روش اول)
- خروجی فعلی یک لیست UL هست، که بر حسب نیاز می تونید تغییرش بدید
این هم اون SQL که فیلد hasChild رو می سازه:
یکی از بچه های همین انجمن دنبال پیمایش درخت و دسته بندی سلسله مراتبی بود، لذا این کد رو اینجا می گذارم برای استفاده سایرین.
کد زیر به جای کوئری های مداوم برای واکشی زیردسته ها از DB، یکبار تمام رکوردها رو از DB واکشی می کنه و پیمایش زیرمجموعه ها رو در سمت PHP انجام میده که باعث میشه حتی در رکوردهای بالا، بهترین کارایی رو داشته باشیم.
نکات:
- داده ها به جای DB، به صورت آرایه هست که به راحتی میشه کد واکشی از DB رو بجاش گذاشت.
- یک فیلد اضافی برای بهبود سرعت به نام hasChild وجود داره، که منظور اینه که آیا این رکورد زیرمجموعه داره یا نه، که با یک جوین SQL میشه درش آورد.(همینطور می شه بجای این فیلد با PHP یک سرچ داخل آرایه ها زد که بگمانم کندتر باشه از روش اول)
- خروجی فعلی یک لیست UL هست، که بر حسب نیاز می تونید تغییرش بدید
<?php function tree($id) { $items = [ ['id' => 1, 'parentId' => '0', 'name' => 'name1', 'hasChild' => 0], ['id' => 2, 'parentId' => '0', 'name' => 'name2', 'hasChild' => 1], ['id' => 3, 'parentId' => '2', 'name' => 'name3', 'hasChild' => 1], ['id' => 4, 'parentId' => '3', 'name' => 'name4', 'hasChild' => 1], ['id' => 5, 'parentId' => '3', 'name' => 'name5', 'hasChild' => 1], ['id' => 6, 'parentId' => '4', 'name' => 'name6', 'hasChild' => 1], ['id' => 7, 'parentId' => '5', 'name' => 'name7', 'hasChild' => 0], ['id' => 8, 'parentId' => '5', 'name' => 'name8', 'hasChild' => 0], ['id' => 9, 'parentId' => '6', 'name' => 'name9', 'hasChild' => 0], ]; $html = '<ul>'; foreach ($items as $item) { if($item['parentId'] == $id) { $html .= '<li>'. $item['name'] .'</li>'; if ($item['hasChild'] == 1) { $html .= tree($item['id']); } } } $html .= '</ul>'; return $html; } echo tree(0);
این هم اون SQL که فیلد hasChild رو می سازه:
SELECT category.id, category.name, category.parentId, IF(count(tmp.id) > 0, 1, 0) as hasChild FROM category LEFT JOIN category AS tmp ON category.id = tmp.parentId GROUP BY category.id