PDA

View Full Version : حرفه ای: یه الگوریتم خیلی سخت و پیچیده (کمک کنییییییییییییییییییییییی ییئد)



sina12345678910
پنج شنبه 09 مهر 1394, 20:39 عصر
با سلام...
من جدیدا به لطف خدا به جایی رسیدم که میتونم الگوریتم حل کنم و برنامه بنویسم، در حال حاضر هم در حال نوشتن یه پروژه هستم که یه جای پروژه خیلی داره ازیتم میکنه و هر کاری میکنم حل نمیشه اگه لطف کنین کمکم کنین واقعا ممنون میشم

پروژه :
به لیست زیر دقت کنید :
135622

الگوریتمی که واسش نوشتم اینه که هر گزینه رو انتخاب کردم key_id ش رو بگیره و یکی اضافه کنه بهش که بیفته بعد اون گزینه بعد بزاره تو دیتابیس، اما یه مشکلی داره اونم اینه که اگر آخرین گزینه رو انتخاب کنیم درست عمل میکنه یعنی میندازه یه دونه بعد اون ، برای بقیه گزینه ها هم این کارو میکنه اما گزینه بعدیش که برابره با این گزینه است همون میمونه و من هم key_id رو یونیک گزاشتم که تکرار نشه چون میخوام با ترتیبی که میخوام نمایش بده و به همین دلیل کوئریم هم اجرا نمیشه برای اینکه جا بیفته با عکسی که گزاشتم مثال میزنم براتون:

همونطوری که تو عکس میبینید گزینه تماس با ما رو انتخاب کردم که key_id = 3 است ، گزینه بعدی اون یعنی (دسته بندی محصولات) key_id = 4 حال اگر بخوایم بعد تماس با ما نمایش داده بشه قاعدتا باید key_id گزینه جدید بشه 4 وبیفته بعد اون، اما چون یونیک و غیر تکراری است این اتفاق نمیفته حتی اگر بخوام یونیک هم بردارم باز شاید یه بار اونجوری که میخوام نمایش بده اما بعد چند گزینه تست گرفتم دیدم نمیشه کلا بهم میریزه

الان اگه یه راهی باشه که تمام گزینه هایی که بعد اون وجود دارن هر کدوم یه دونه اضافه شه یا هر الگوریتمی که این مشکلو حل کنه واقعا عالی میشه و واقعا ممنون میشم کمکم کنید....

اینی هم که کدهاشو نزاشتم دلیلش این بود که خیلی پیچیده شده و هر کاری تو یه فایلی انجام میشه خودمم توش گم میشم من فقط راه کار میخوام ممنون میشم

kabootar_y
جمعه 10 مهر 1394, 00:18 صبح
پیشنهاد من اینه که key_id رو از حالت یونیک خارج کنید.

بعد:

مثلا می خواهیم جای تماس با ما و صفحه دسته بندی محصولات رو جابه جا کنیم








$key_id = 3; // آیدی فعلی تماس با ما
$new_key_id = 4 // آیدی فعلی صفحه دسته بندی محصولات


$first_sql = "UPDATE tablename SET key_id = '$new_key_id' WHERE key_id = '$key_id'";
$second_sql = "UPDATE tablename SET key_id = '$key_id' WHERE key_id = '$new_key_id'";

sina12345678910
جمعه 10 مهر 1394, 12:09 عصر
ممنون از پاسختون اما دوست عزیز نتیجه این کار با نتیجه ای که من میخواستم فرق داره این فقط جابجایی هست اما من میخوام هر جایی رو که انتخاب کردم بعد اون اضافه کنه...
ممنون میشم اگه بتونین راه حلی برای همون کاری که میخواستم بگید...
تشکر از لطف همتون

H:Shojaei
جمعه 10 مهر 1394, 12:33 عصر
خوب هیچ کجا نگفتید که میخواید اضافه کنید... حالا به هر حال...
من این مورد رو خیلی خیلی پیچیده ترش رو انجام دادم و قبلا هم خیلی تحقیق کردم به روشی رسیدم...
و اون لیست پیوندی بود...
چطور این کار انجام میشه شما واسه هر یک از این موارد که مثلا ما میگیم صفحات این لیست دوتا فیلد نیاز دارید اولی id خودش و بعدی هم id گزینه قبلی که تو لیست بعد از این صفحه قرار میگیره مثلا اگر لیست مرتب باشه به این صورت میشه:


صفحه
id
prevId


صفحه اصلی
1
0


درباره ما
2
1


تماس با ما
3
2



حالا وقتی قراره یک گزینه بین صفحه اصلی و درباره ما درج بشه باید مقدار prevId صفحه جدید بشه prevId درباره ما و prevId درباره ما بشه id صفحه جدید به این صورت:


صفحه
id
prevId


صفحه اصلی
1
0


صفحه جدید
4*
1*


درباره ما
2
4*


تماس با ما
3
2

sina12345678910
جمعه 10 مهر 1394, 14:41 عصر
ممنون از لطفتون ذهن منو خیلی باز کردید اما الان من وقتی که میخوام به ترتیب گزینه هارو نمایش بدم از هر کدوم از فیلد ها که order by بگیرم ترتیبش بهم میخوره و بازم درست نمایش نمیده یعنی الان اگه بگم order by id صفحه جدید میره آخر و اگه هم بگم order by prevId این بار درباره ما میره آخر...!!

من درست متوجه نشدم که اینجا باید چی کار کنم اگه لطف کنید بیشتر توضیح بدید ممنون میشم...یا اینکه یه منبعی معرفی کنید مثله لینک، کتاب ، کد و...

H:Shojaei
جمعه 10 مهر 1394, 15:14 عصر
یادم رفت پیمایشش رو بگم...
اول همه رو بگیرید به ترتیبش هم کاری نداشته باشید بعد با دو حلقه تو در تو اول گزینه ها رو نمایش بدین...
به عنوان مثال اول باید اونی که previd=0 داره رو چاپ کنید حالا id این رو نگه میدارید داخل $pid مثلا و واسه پیدا کردن مورد بعدی میگید اونی که prevId=$pid هست رو چاپ کنه...
اگر احیانا تلاش کردید و به مشکل خوردید واسه حلقه ها بگید بنویسمش...

sina12345678910
جمعه 10 مهر 1394, 15:36 عصر
جناب اگه لطف کنید به همراه کد کامل تر توضیح بدید واقعا ممنون میشم چون این مسئله خیلی سخته و اصلا با ترتیب بندی که من ازش فهمیدم جور در نمیاد و هر کاری میکنم به نتیجه ای نمیرسم چون بلاخره باید یه order by بدیم که اونجوری که میخوایم خروجی بده...
من قبلا از طریق لیست پیوندی یه منوی آبشاریه چند سطحی نوشتم که مشابه این بود ولی اون خیلی آسون تر بود چون فقط قرار بود که عمل == کردن رو بین دو فیلد برقرار کنیم اما الان موضوع ترتیب بندیه و خیلی پیچیده شده...!!
ببخشید دیگه تازه کاریم فعلا طول میکشه تا خوب بفهمیم...:قهقهه:

H:Shojaei
جمعه 10 مهر 1394, 15:57 عصر
تستش نکردم...
list آرایه ای هست که از دیتابیس میگیرید... و sortedList هم مرتب شده اون




$listCount=count($list);
$sortedList=array();
$index=0;
for ($f = 0; $f < $listCount; $f++) {
$listCount1=count($list);
for ($i = 0; $i < $listCount1; $i++) {
if ($f == 0) {
if ($list[$i]['prev'] == 0) {
$start = $list[$i]['id'];
$sortedList[$g++] = $list[$i];
unset($list[$i]);
}
} else {
if ($list[$i]['prev'] == $start) {
$start = $list[$i]['id'];
$sortedList[$index++] = $list[$i];
unset($list[$i]);
}
}
}
}
print_r($sortedList);