سلام دوستان ، ممنون میشم به من کمک کنید .
من توی برنامم می خوام یک آرایه چند سطحی را بر اساس عناصر داخل یک آرایه دیگه فیلتر کنم . ولی با کدی که نوشتم فقط عنصر آخر آرایه دوم رو در نظر میگیره و آرایه اول را برای من فیلتر میکنه .
بذارین کارکردی که انتظار دارم را هم براتون توضیح بدم که بهتر متوجه بشین شاید کلا دارم اشتباه میرم :
ببینین آرایه اول لیستی از محصولاته که مواردی برای منع مصرف محصول هم داخلشه ولیست بعدی موارد منع مصرف مشتریه . میخوام تک تک موارد منع مصرف مشتری توی لیست محصولات چک بشه و اون محصولاتی که اون منع مصرف ها را دارن حذف بشن و نهایتاً یک لیست محصول از محصولاتی که اون منع مصرف ها را ندارن به من برگردونه.
کدی که نوشتم اینه :
$tosie_sobh = array_filter($product_sobh , function($item) use ($mane_masraf_moshtari){
foreach ($mane_masraf_moshtari as $i) {
if (is_string($i)==true){
$n = explode(",",$i);
foreach ($n as $m) {
return strstr($item['mane_masraf'],$m) == false ;
}}elseif ($i == null){
$i='هیچی';
return strstr($item['mane_masraf'],$i) == false ; }else{
return strstr($item['mane_masraf'],$i) == false ; }
}
});
ببین با همون مدل قبلی دیتابیست کار میکنه؟
$tosie_sobh = array_filter($product_sobh, function ($product) use ($mane_masraf_moshtari) {
$product_mane_masraf = trim($product['mane_masraf']);
if(empty($product_mane_masraf))
return true;
foreach ($mane_masraf_moshtari as $mane_moshtari) {
if (empty($mane_moshtari))
continue;
if (is_string($mane_moshtari))
foreach(explode(",", $mane_moshtari) as $mane)
if(strstr($product_mane_masraf,trim($mane)))
return false;
}
return true;
});
بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ
الْحَمْدُ لِلّٰه
سلام، اگه میشه یک مثالی هم از آرایه ها بزن و خروجی مدنظر و خروجی کدت را همین جا بفرست برای درک بهتر تشکر :)
ببین این چطوره؟
$tosie_sobh = array_filter($product_sobh, function ($item) use ($mane_masraf_moshtari) {
foreach ($mane_masraf_moshtari as $i) {
if (is_string($i) == true) {
foreach (explode(",", $i) as $m)
if(strstr($item['mane_masraf'], $m))
return false;
} elseif ($i == null) {
$i = 'هیچی';
}
return strstr($item['mane_masraf'], $i) == false;
}
return true;
});
ممنون از توجهتون . چشم
مثلا این آرایه اول هستش که میخوایم فیلترش کنیم:
array(4) {
[0]=>
array(7) {
["id"]=>
int(54)
["name"]=>
string(10) "آلورا"
["fayde"]=>
string(24) "میگرن,کبد چرب"
["mane_masraf"]=>
string(0) ""
["olaviat"]=>
string(0) ""
["vade"]=>
string(6) "صبح"
["price"]=>
int(50000)
}
[1]=>
array(7) {
["id"]=>
int(55)
["name"]=>
string(19) "راز سلامتی"
["fayde"]=>
string(10) "میگرن"
["mane_masraf"]=>
string(46) "کیست سینه ، رحم یا تخم دان"
["olaviat"]=>
string(23) "میگرن قاعدگی"
["vade"]=>
string(6) "صبح"
["price"]=>
int(60000)
}
[2]=>
array(7) {
["id"]=>
int(56)
["name"]=>
string(20) "بادرنجبویه"
["fayde"]=>
string(10) "میگرن"
["mane_masraf"]=>
string(53) "کم کاری تیروئید,فشار خون بالا"
["olaviat"]=>
string(14) "آرامبخش"
["vade"]=>
string(11) "صبح,شب"
["price"]=>
int(45000)
}
[3]=>
array(7) {
["id"]=>
int(57)
["name"]=>
string(41) "شنبلیله ، گزنه و گشنیز"
["fayde"]=>
string(24) "میگرن,کبد چرب"
["mane_masraf"]=>
string(0) ""
["olaviat"]=>
string(38) "میگرن قاعدگی,سینوزیت"
["vade"]=>
string(6) "صبح"
["price"]=>
int(45000)
}
}
این منع مصرف های کاربر هستش :
array(1) {
[0]=>
string(28) "کم کاری تیروئید"
}
البته با یک منع مصرف همون که نوشته بودم گویا درست کار می کرد ولی وقت فرد چند تا گزینه را میزنه و چند منع مصرف توی آرایه داریم دیگه درست کار نمی کنه و فقط منع مصرف آخری رو اعمال میکنه .
و اینم نتیجه نهایی کد خودم :
array(3) {
[0]=>
array(7) {
["id"]=>
int(54)
["name"]=>
string(10) "آلورا"
["fayde"]=>
string(24) "میگرن,کبد چرب"
["mane_masraf"]=>
string(0) ""
["olaviat"]=>
string(0) ""
["vade"]=>
string(6) "صبح"
["price"]=>
int(50000)
}
[1]=>
array(7) {
["id"]=>
int(55)
["name"]=>
string(19) "راز سلامتی"
["fayde"]=>
string(10) "میگرن"
["mane_masraf"]=>
string(46) "کیست سینه ، رحم یا تخم دان"
["olaviat"]=>
string(23) "میگرن قاعدگی"
["vade"]=>
string(6) "صبح"
["price"]=>
int(60000)
}
[3]=>
array(7) {
["id"]=>
int(57)
["name"]=>
string(41) "شنبلیله ، گزنه و گشنیز"
["fayde"]=>
string(24) "میگرن,کبد چرب"
["mane_masraf"]=>
string(0) ""
["olaviat"]=>
string(38) "میگرن قاعدگی,سینوزیت"
["vade"]=>
string(6) "صبح"
["price"]=>
int(45000)
}
}
ممنونم از اینکه وقت میذارید و کمک میکنید .
نه متاسفانه کماکان همون مشکل را داره . با یه منع مصرف درست کار میکنه ولی چند تا رو اعمال نمیکنه و فقط آخری را اعمال میکنه .
وقتی منع مصرف چند تایی میشه مثل نمونه زیر دیگه درست نمیکنه و فقط عنصر آخر آرایه منع مصرف را اعمال میکنه :
array(4) {
[0]=>
string(43) "زخم معده یا زخم اثنی عشر"
[1]=>
string(28) "کم کاری تیروئید"
[2]=>
string(24) "فشار خون بالا"
[3]=>
string(46) "کیست سینه ، رحم یا تخم دان"
}
دوباره عوض شد ببین کار میکنه؟
$tosie_sobh = array_filter($product_sobh, function ($product) use ($mane_masraf_moshtari) {
foreach ($mane_masraf_moshtari as $mane_moshtari) {
if (is_string($mane_moshtari)) {
foreach(explode(",", $product['mane_masraf']) as $product_mane)
if(strstr($product_mane,$mane_moshtari))
return false;
}
}
return true;
});
کد بالا فکر کنم کار کنه و این که مشکل یکیش اینجا بود که داخل حلقه foreach توی اولین گردش در هر صورت یک چیزی برگشت داده میشه و بالاخره در هیچ صورت به گردش ها یا پیمایش های بعدی نمی رسه و به عبارتی حتی اگر منع مصرف چند تا باشه فقط رو یکیش میره چک میشه...
😍😍😍
یک دنیا تشکر ... تا حد زیادی درست شد .
البته یه قسمت کوچیکش اشتباه شده بوداصلاحش کردم به این شکل:
یه نگاهش بندازین بی زحمت شمام .
و اینکه یه مسئله دیگه داره و اونم اینکه وقتی فرد هیچ گزینه ای را انتخاب نمیکنه رشته خالی را میبره سرچ میکنه و طبیعتاً چون همه محصولات توی منع مصرفشون فاصله خورده همه را حذف میکنه . اینم اگه زحمتی نیست یه راهنمایی بهم بکنید .
$tosie_sobh = array_filter($product_sobh, function ($product) use ($mane_masraf_moshtari) {
foreach ($mane_masraf_moshtari as $mane_moshtari) {
if (is_string($mane_moshtari)) {
foreach(explode(",", $mane_moshtari) as $mane)
if(strstr($product['mane_masraf'],$mane))
return false;
}
}
return true;
});
الان مگه طبق:
ممنون از توجهتون . چشم
مثلا این آرایه اول هستش که میخوایم فیلترش کنیم:
array(4) {
[0]=>
array(7) {
["id"]=>
int(54)
["name"]=>
string(10) "آلورا"
["fayde"]=>
string(24) "میگرن,کبد چرب"
["mane_masraf"]=>
string(0) ""
["olaviat"]=>
string(0) ""
["vade"]=>
string(6) "صبح"
["price"]=>
int(50000)
}
[1]=>
array(7) {
["id"]=>
int(55)
["name"]=>
string(19) "راز سلامتی"
["fayde"]=>
string(10) "میگرن"
["mane_masraf"]=>
string(46) "کیست سینه ، رحم یا تخم دان"
["olaviat"]=>
string(23) "میگرن قاعدگی"
["vade"]=>
string(6) "صبح"
["price"]=>
int(60000)
}
[2]=>
array(7) {
["id"]=>
int(56)
["name"]=>
string(20) "بادرنجبویه"
["fayde"]=>
string(10) "میگرن"
["mane_masraf"]=>
string(53) "کم کاری تیروئید,فشار خون بالا"
["olaviat"]=>
string(14) "آرامبخش"
["vade"]=>
string(11) "صبح,شب"
["price"]=>
int(45000)
}
[3]=>
array(7) {
["id"]=>
int(57)
["name"]=>
string(41) "شنبلیله ، گزنه و گشنیز"
["fayde"]=>
string(24) "میگرن,کبد چرب"
["mane_masraf"]=>
string(0) ""
["olaviat"]=>
string(38) "میگرن قاعدگی,سینوزیت"
["vade"]=>
string(6) "صبح"
["price"]=>
int(45000)
}
}
$product['mane_masraf']
توی آرایه اولی یا همون محصولات با comma ',' جدا نشده؟!
اما چرا اینجا از $mane_moshtari در جداسازی استفاده شده؟
explode(",", $mane_moshtari)
نه اونجاهایی که با ، کامای فارسی جدا شده یک منع مصرفه . مثلا "کیست سینه، رحم و تخمدان"
اونجاهایی که منع مصرف دیگه ایه کامای انگلیسیه . اینجوری ","
منظور من اینه که چرا
explode(",", $product['mane_masraf'])
به
explode(",", $mane_moshtari)
تغییر داده شده؟
و فکر کنم قبل حلقه باید بررسی شه که خالی هست یا نه
$tosie_sobh = array_filter($product_sobh, function ($product) use ($mane_masraf_moshtari) {
if(empty($product['mane_masraf']))
return true;
foreach ($mane_masraf_moshtari as $mane_moshtari) {
if (is_string($mane_moshtari)) {
foreach(explode(",", $mane_moshtari) as $mane)
if(strstr($product['mane_masraf'],$mane))
return false;
}
}
return true;
});
منظور از این که : زمانی که هیچ منع مصرفی نیست درست کار نمی کنه، منظور چیه اینه که کدوم خالی باشه و اینکه چرا خروجیش درست نیست؟
ببنید مثل نمونه زیر $mane_masraf_moshtari کلا یه آرایه خالی وقتی میشه توی برنامه :
array(1) {
[0]=>
string(0) ""
میره کلا میگرده توی رشته منع مصرف محصول هر جا space خورده باشه اون رو میگیره و واسه همین همه محصول را حذف میکنه از لیست مگر اینکه کلا منع مصرفی نداشته باشه اون محصول .
امیدوارم تونسته باشم توضیح بدم
یه جور دیگه حلش کردم . اومدم توی دیتا بیس مقدار پیش فرض 0 گذاشتم برای منع مصرفی که ست نشده. به نظرتون کار درستیه ؟
ببین با همون مدل قبلی دیتابیست کار میکنه؟
$tosie_sobh = array_filter($product_sobh, function ($product) use ($mane_masraf_moshtari) {
$product_mane_masraf = trim($product['mane_masraf']);
if(empty($product_mane_masraf))
return true;
foreach ($mane_masraf_moshtari as $mane_moshtari) {
if (empty($mane_moshtari))
continue;
if (is_string($mane_moshtari))
foreach(explode(",", $mane_moshtari) as $mane)
if(strstr($product_mane_masraf,trim($mane)))
return false;
}
return true;
});
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟