سلام دوستان خسته نباشید .ممنون میشم اگه به من کمک کنید :
من 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 سعی کردم استفاده کنم ولی موفق نشدم . ممنون میشم اگه کمکم کنید .
واسه این که یک متغیر را از خارج از متغیر داشته باشی هم باید از 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;
};
بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ
الْحَمْدُ لِلّٰه
سلام، یک بحثی به وجود میاد که خب اولویت های مشتری یا کاربر وقتی چند تا هستند چی میشه؟(بر اساس ترتیبشون)؟
مثل اولویت های :
array(2) {
[0]=>
string(0) ""
[1]=>
string(15) "خواب آور"
[2]=>
string(15) "آرام بخش"
}
تابع 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
@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');
این کدو امتحان کن! منتهی داده ها فرضی هستند!
$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);
واسه این که یک متغیر را از خارج از متغیر داشته باشی هم باید از 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;
};
امتحانش کردم... مرسی از وقتی که گذاشتین. منتها درست کار نمیکنه ... 😭😭😭😭
نیاز داره تغییری توش بدم با توجه به آرایه هایی که برنامه خودم داره ؟
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);
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟