۴۰۴ Not Found! قیمت ها به ۴۰۳ برگشت! به مدت محدود!

بزن بریم!
ثانیه
دقیقه
ساعت
روز
25 پاسخ

فیلتر کردن یک آرایه چند سطحی بر اساس عناصر داخل یک آرایه دیگر

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

کدی که نوشتم اینه :

    $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 ;  }
        }
    });

@sinashahoveisi
@hesammousavi
@mohsenbostan


ثبت پرسش جدید
ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 3 سال پیش مطرح شد
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;
});

ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 3 سال پیش مطرح شد
0

بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ
الْحَمْدُ لِلّٰه

سلام، اگه میشه یک مثالی هم از آرایه ها بزن و خروجی مدنظر و خروجی کدت را همین جا بفرست برای درک بهتر تشکر :)


ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 3 سال پیش مطرح شد
0

ببین این چطوره؟

$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;
});

آرمان طحان پور اردکانی
تخصص : مدیر فروش
@armantahanpour 3 سال پیش مطرح شد
0

ممنون از توجهتون . چشم

مثلا این آرایه اول هستش که میخوایم فیلترش کنیم:

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)
  }
}

ممنونم از اینکه وقت میذارید و کمک میکنید .


آرمان طحان پور اردکانی
تخصص : مدیر فروش
@armantahanpour 3 سال پیش آپدیت شد
0

نه متاسفانه کماکان همون مشکل را داره . با یه منع مصرف درست کار میکنه ولی چند تا رو اعمال نمیکنه و فقط آخری را اعمال میکنه .

وقتی منع مصرف چند تایی میشه مثل نمونه زیر دیگه درست نمیکنه و فقط عنصر آخر آرایه منع مصرف را اعمال میکنه :

array(4) {
  [0]=>
  string(43) "زخم معده یا زخم اثنی عشر"
  [1]=>
  string(28) "کم کاری تیروئید"
  [2]=>
  string(24) "فشار خون بالا"
  [3]=>
  string(46) "کیست سینه ، رحم یا تخم دان"
}

ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 3 سال پیش آپدیت شد
0

دوباره عوض شد ببین کار میکنه؟

$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;
});

ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 3 سال پیش مطرح شد
0

کد بالا فکر کنم کار کنه و این که مشکل یکیش اینجا بود که داخل حلقه foreach توی اولین گردش در هر صورت یک چیزی برگشت داده میشه و بالاخره در هیچ صورت به گردش ها یا پیمایش های بعدی نمی رسه و به عبارتی حتی اگر منع مصرف چند تا باشه فقط رو یکیش میره چک میشه...


آرمان طحان پور اردکانی
تخصص : مدیر فروش
@armantahanpour 3 سال پیش مطرح شد
0

😍😍😍
یک دنیا تشکر ... تا حد زیادی درست شد .
البته یه قسمت کوچیکش اشتباه شده بوداصلاحش کردم به این شکل:
یه نگاهش بندازین بی زحمت شمام .
و اینکه یه مسئله دیگه داره و اونم اینکه وقتی فرد هیچ گزینه ای را انتخاب نمیکنه رشته خالی را میبره سرچ میکنه و طبیعتاً چون همه محصولات توی منع مصرفشون فاصله خورده همه را حذف میکنه . اینم اگه زحمتی نیست یه راهنمایی بهم بکنید .

    $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;
    });

ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 3 سال پیش مطرح شد
0

الان مگه طبق:

ممنون از توجهتون . چشم

مثلا این آرایه اول هستش که میخوایم فیلترش کنیم:

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)

آرمان طحان پور اردکانی
تخصص : مدیر فروش
@armantahanpour 3 سال پیش مطرح شد
0

نه اونجاهایی که با ، کامای فارسی جدا شده یک منع مصرفه . مثلا "کیست سینه، رحم و تخمدان"
اونجاهایی که منع مصرف دیگه ایه کامای انگلیسیه . اینجوری ","


آرمان طحان پور اردکانی
تخصص : مدیر فروش
@armantahanpour 3 سال پیش مطرح شد
0

الان درست کار میکنه کاملا . فقط زمانی که هیچ منع مصرفی نیست داره اشتباه کار میکنه .


ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 3 سال پیش مطرح شد
0

منظور من اینه که چرا

explode(",", $product['mane_masraf'])

به

explode(",", $mane_moshtari)

تغییر داده شده؟


ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 3 سال پیش مطرح شد
0

و فکر کنم قبل حلقه باید بررسی شه که خالی هست یا نه

$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;
});

آرمان طحان پور اردکانی
تخصص : مدیر فروش
@armantahanpour 3 سال پیش آپدیت شد
0

ببینیدما در واقع میخوایم منع مصرف مشتری را explode کنیم نه منع مصرف محصول رو .


آرمان طحان پور اردکانی
تخصص : مدیر فروش
@armantahanpour 3 سال پیش مطرح شد
0

بیرون حلقه هم تستش کردم . متاسفانه جواب نمیده


ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 3 سال پیش مطرح شد
0

منظور از این که : زمانی که هیچ منع مصرفی نیست درست کار نمی کنه، منظور چیه اینه که کدوم خالی باشه و اینکه چرا خروجیش درست نیست؟


آرمان طحان پور اردکانی
تخصص : مدیر فروش
@armantahanpour 3 سال پیش مطرح شد
0

ببنید مثل نمونه زیر $mane_masraf_moshtari کلا یه آرایه خالی وقتی میشه توی برنامه :

array(1) {
  [0]=>
  string(0) ""

میره کلا میگرده توی رشته منع مصرف محصول هر جا space خورده باشه اون رو میگیره و واسه همین همه محصول را حذف میکنه از لیست مگر اینکه کلا منع مصرفی نداشته باشه اون محصول .

امیدوارم تونسته باشم توضیح بدم


ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 3 سال پیش مطرح شد
0

اها پس مشکل از white spaces هست ؟ مثل خط بعدی و فاصله و تب و ... ؟


آرمان طحان پور اردکانی
تخصص : مدیر فروش
@armantahanpour 3 سال پیش مطرح شد
0

فکر میکنم . یعنی این به عقلم رسید هرچی دارم نگاهش میکنم .


آرمان طحان پور اردکانی
تخصص : مدیر فروش
@armantahanpour 3 سال پیش مطرح شد
0

یه جور دیگه حلش کردم . اومدم توی دیتا بیس مقدار پیش فرض 0 گذاشتم برای منع مصرفی که ست نشده. به نظرتون کار درستیه ؟


ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 3 سال پیش مطرح شد
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;
});

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام