رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
پیمایش و نمایش دسته بندی های سلسله مراتبی (درخت)
#1
سلام
یکی از بچه های همین انجمن دنبال پیمایش درخت و دسته بندی سلسله مراتبی بود، لذا این کد رو اینجا می گذارم برای استفاده سایرین.

کد زیر به جای کوئری های مداوم برای واکشی زیردسته ها از 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
پاسخ
تشکر شده توسط: Mohammadsgh , php , meysam1366 , abdollah110110 , php_programmer021




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