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 2 سال پیش مطرح شد
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 2 سال پیش مطرح شد
0

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

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


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

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

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

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

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

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


آرمان طحان پور اردکانی
تخصص : مدیر فروش
@armantahanpour 2 سال پیش مطرح شد
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 2 سال پیش مطرح شد
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 2 سال پیش مطرح شد
0

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


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

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


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

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

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

به

explode(",", $mane_moshtari)

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


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

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


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

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


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

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


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

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

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

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

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


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

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


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

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


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

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


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

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

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