9 پاسخ

مرتب سازی عناصر آرایه چند سحی بر اساس موارد یک آرایه دیگر

سلام دوستان خسته نباشید .ممنون میشم اگه به من کمک کنید :

من 2 آرایه دارم به شکل زیر :

آرایه اول با نام اولویت مشتری :

array(2) {
  [0]=>
  string(0) ""
  [1]=>
  string(15) "خواب آور"

آرایه دوم با نام محصولات توصیه شده :

array(3) {
  [0]=>
  array(7) {
    ["id"]=>
    int(54)
    ["name"]=>
    string(10) "آلورا"
    ["fayde"]=>
    string(24) "میگرن,کبد چرب"
    ["mane_masraf"]=>
    string(43) "زخم معده یا زخم اثنی عشر"
    ["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)
  }

میخوام عناصر آرایه اولویت مشتری(آرایه اول) را داخل اندیس "اولویت " آرایه محصولات توصیه شده(آرایه دوم) جستجو کنم و اگه وجود داشت اون محصول توی آرایه محصولات توصیه شده(آرایه دوم) بیاد اول قرار بگیره .

از تابع ()uasort سعی کردم استفاده کنم ولی موفق نشدم . ممنون میشم اگه کمکم کنید .


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

واسه این که یک متغیر را از خارج از متغیر داشته باشی هم باید از global ، استفاده کنی ( اما اگه تابع anonymous باشه از use هم میشه استفاده کرد ) :

//outer variable
$a = 10;

//named functions (non-anonymous) just `use`
function getA(){
    global $a;
    return $a;
}

//anonymous function `use`+`global`
$getA = function() use ($a){
    return $a;
};
$getA = function(){
    global $a;
    return $a;
};

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

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

سلام، یک بحثی به وجود میاد که خب اولویت های مشتری یا کاربر وقتی چند تا هستند چی میشه؟(بر اساس ترتیبشون)؟
مثل اولویت های :

array(2) {
    [0]=>
    string(0) ""
    [1]=>
    string(15) "خواب آور"
    [2]=>
    string(15) "آرام بخش"
}  

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

سلام ، ممنون از پاسختون
بله دقیقا . بر اساس ترتیبشون


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

تابع uasort
منبع اصلی

uasort(array &$array,callable $callback);

این تابع دو ورودی می گیره :

1: $array ، آرایه موردنظر با refernece ( & )
2: $callback ، تابعی که واسه شخصی سازی الگوی مرتب سازی ازش استفاده میشه

خب حالا درباره $callback بیایم بریم :
به این تابع دو ورودی تزریق میشه یا به عبارتی دو تا پارامتر داره که هریکیشون یکی از المنت های آرایه ($array) است.
بیایم اولین پارامتر رو $a و دومین پارامتر رو $b ، در نظر بگیریم:

fundtion($a,$b){
    //todo ...
}

وحالا باید داخل این تابع یا عامل / callback ( به این دلیل بهش گفته میشه callback ، چون بعد از تعریفش.. خود تابع uasort واسه مرتب کردن صداش میزنه..)
ادامه که باید این تابع عددی
یا کمتر از صفر ( اولین پارامتر عقب تر/پایین تر/اولویت کمتر از دومین پارامتر )
یا برابر با صفر ( اولین پارامتر هم ترازِ دومین پارامتر )
یا بیشتر از صفر ( اولین پارامتر جلوتر/بالاتر/اولویت بیشتر از دومین پارامتر )
باشه :

fundtion($a,$b){
    // returns < 0 : $a < $b
    // returns = 0 : $a = $b
    // returns > 0 : $a > $b

    if($a > $b) return 1;
    if($a == $b) return 0;
    if($a < $b) return -1;
}

نکته اینجاست که برگشتی الزامی نیست فقط عدد باشه و حتی می تونه boolean هم باشه که خیلی بدرد می خوره که true معادل بیشتر از ۰ و false معادل صفر در نظر گرفته میشود !

یک مثال چسبناک :

$users = [
    ['name'=>'ali', 'points'=>120],
    ['name'=>'abol', 'points'=>20],
    ['name'=>'sajjad', 'points'=>10],
    ['name'=>'sama', 'points'=>160],
    ['name'=>'sara', 'points'=>1],
];

uasort($users, function($a, $b){
    return $a['points'] <=> $b['points'];
});

// $users : [
//     ['name'=>'sara', 'points'=>1],
//     ['name'=>'sajjad', 'points'=>10],
//     ['name'=>'abol', 'points'=>20],
//     ['name'=>'ali', 'points'=>120],
//     ['name'=>'sama', 'points'=>160],
// ];

//notice :
// Spaceship operator : $a <=> $b
// it returns -1 if : $a < $b
// it returns 0 if : $a == $b
// it returns +1 if : $a > $b

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

@abol313
ممنون از توضیحاتتون .
حالا توی این مسئله من چطور باید از این تابع استفاده کرد . آخه من توی این تابع میخوام از یه متغییر بیرونی استفاده کنم . اونو باید چی کار کنم .

خودم یه همچین کدی نوشتم ، ولی ایراد داره و نمیدونم مشکلش چیه دقیقا :

function olaviat_sort($a , $b) {
    foreach ($olaviat_moshtari as $olaviats) {
        if(strstr($a['olaviat'],trim($olaviats) == true) && strstr($b['olaviat'],trim($olaviats) ==false))
        return -1;
        if(strstr($b['olaviat'],trim($olaviats) == true) && strstr($a['olaviat'],trim($olaviats) ==false))
        return 1;
        if(strstr($a['olaviat'],trim($olaviats) == true OR false) && strstr($b['olaviat'],trim($olaviats) ==true OR false))
        return 0;
    }

}

uasort($tosie_sobh,'olaviat_sort');

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

این کدو امتحان کن! منتهی داده ها فرضی هستند!

$olaviat_moshtari = ['d','d','a'];

$productions = [
    [1,'olaviat'=>'a'],
    [2,'olaviat'=>'a'],
    [3,'olaviat'=>'b'],
    [4,'olaviat'=>'a'],
    [5,'olaviat'=>'b'],
    [6,'olaviat'=>'b'],
    [7,'olaviat'=>'d'],
    [8,'olaviat'=>'c'],
];

function hasOlaviat($production){
    global $olaviat_moshtari;
    $len = count($olaviat_moshtari);
    for($i = 0; $i < $len; $i++)
        if (strstr($production['olaviat'],trim($olaviat_moshtari[$i])))
            return $len - $i;
    return false;
}

function olaviat_sort($a , $b){
    $aOlaviat = hasOlaviat($a);
    $bOlaviat = hasOlaviat($b);

    return $aOlaviat < $bOlaviat; 
}

uasort($productions,'olaviat_sort');

print_r($productions);

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

واسه این که یک متغیر را از خارج از متغیر داشته باشی هم باید از global ، استفاده کنی ( اما اگه تابع anonymous باشه از use هم میشه استفاده کرد ) :

//outer variable
$a = 10;

//named functions (non-anonymous) just `use`
function getA(){
    global $a;
    return $a;
}

//anonymous function `use`+`global`
$getA = function() use ($a){
    return $a;
};
$getA = function(){
    global $a;
    return $a;
};

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

یک دنیا تشکر ...ممنون از راهنمایی هات ابوالفضل جان🙏🙏🙏🙏


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

امتحانش کردم... مرسی از وقتی که گذاشتین. منتها درست کار نمیکنه ... 😭😭😭😭
نیاز داره تغییری توش بدم با توجه به آرایه هایی که برنامه خودم داره ؟


آرمان طحان پور اردکانی
تخصص : مدیر فروش
@armantahanpour 2 سال پیش مطرح شد
0
function hasOlaviat($production){
    global $olaviat_moshtari;
    $len = count($olaviat_moshtari);
    for($i = 0; $i < $len; $i++)
        if (strstr($production['olaviat'],trim($olaviat_moshtari[$i])))
            return $len - $i;
    return false;
}

function olaviat_sort($a , $b){
    $aOlaviat = hasOlaviat($a);
    $bOlaviat = hasOlaviat($b);

    return $aOlaviat < $bOlaviat; 
}

uasort($tosie_sobh,'olaviat_sort');

echo 'پک نهایی : ';
print_r($tosie_sobh);

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

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