PDA

View Full Version : آموزش: ساخت منو تو در تو تنها با یک کوئری (کاربردی)



captain_hamid
دوشنبه 15 دی 1393, 09:01 صبح
ساخت منو تو در تو در این سایت به روشی جالب پیاده سازی شده.( حتما نگاه بندازین کاربردیه)
http://phpro.org/tutorials/Simple-Mysql-PHP-Menu.html
فقط یکم گنگ واسه من که چجوری این آرایه رو تشکیل میده.

arenaw
دوشنبه 15 دی 1393, 10:39 صبح
این یه مثال شبیه بهش که شاید راحت‌تر بشه فهمیدش:

اسم تیبل: انسان
فیلدها: آی‌دی - نام - والد

رکوردها:

1 - بابابزرگ - NULL
2 - بابا - 1
3 - عمو - 1
4 - من - 2
5 - داداشم - 2
6 - بچه‌ـم - 4
7 - بچه‌ی داداشم - 5
8 - نوه‌ی من - 6
.
.
.

فیلد آخر، منظورش پدرِ رکورد هستش. یعنی آیدی شماره 6 که بچه‌ی من باشه رو من به وجود آوردمش، پس فیلد "والد"ـش میشه آیدی من. همینجوری هم تا آخر...


+

کدهای پی اچ پی منظقش اینجوریه:
سکت هرچی فرام این تیبل...
یه آرایه خالی به اسم "لیست"
به ازای هر رکورد:
اگه آیدی پرنت این رکورد توی آرایه "لیست" نبود، یه عنصر با کلید آیدی این رکورد اضافه کن و این رکورد رو منتقل کن اونجا.
اگه آیدی پرنت این رکورد توی آرایه "لیست" بود، یه عنصر توی همون خونه از آرایه با کلید "بچه ها" درست کن و این رکورد رو به اونجا منتقل کن.

// به خاطر اینکه مستقیما رکوردها رو انتقال میده و کپی نمیکنه، وقتی هر تغییری روی متغیر اعمال میشه، روی جاهایی هم که این منتغیر انتقال پیدا کرده اعمال میشه.

فانکشن دومش هم که یه فانکشن بازگشتیه که "لیست" رو میگیره، هر عنصری که توش "بچه ها" داشت، میاد یه بار دیگه خودش رو کال میکنه...

captain_hamid
سه شنبه 16 دی 1393, 20:51 عصر
من فکر می کردم این مسئله خیلی کاربردی باشه با توجه به اینکه چندین دفعه افراد همین سوال رو مطرح کرده بودن.

arenaw
چهارشنبه 17 دی 1393, 10:52 صبح
اینم با یه منطق دیگه که خودم نوشتم.

اگه فرض بگیریم لیستمون این باشه:

$list[1]['name'] = 'baba bozorge man';
$list[1]['parent'] = null;

$list[2]['name'] = 'babam';
$list[2]['parent'] = 1;

$list[3]['name'] = 'amum';
$list[3]['parent'] = 1;

$list[4]['name'] = 'pesar amum';
$list[4]['parent'] = 3;

$list[5]['name'] = 'man';
$list[5]['parent'] = 2;

$list[6]['name'] = 'bacham';
$list[6]['parent'] = 5;

$list[7]['name'] = 'baba bozorge mammad';
$list[7]['parent'] = null;

$list[8]['name'] = 'babaye mammad';
$list[8]['parent'] = 7;

$list[9]['name'] = 'mammad';
$list[9]['parent'] = 8;





اونوقت آرایه تو در تومون میشه:



foreach($list as $key=>$value){
$parentID = $value['parent'];
if( isset( $list[$parentID] ) )
$list[ $parentID ]['childrens'][] = &$list[$key];
}

$listCopy = array();
foreach($list as $value){
$parentID = $value['parent'];
if( ! isset( $list[$parentID] ) )
$listCopy[] = $value;
}

print_r( $listCopy );