سلام دوستان
میخوام بدونم منطق شما برای حل مسئله مقایسه دو آرایه توی لاراول چیه
من توی دیتابیسم آرایه ای از یک آبجکت json دارم که میخوام یکسری از فیلدهای اون با فیلدهای آرایه ای که از سمت کاربر میاد مقایسه شه (هم تعداد و هم مقادیر فیلد). درست مثل یه چک لیست
چنتا چالش دارم
اول ممکنه کاربر آبجکت ها رو نا مرتب بفرسته و ترتیبش مثل فیلدهای دیتابیس نباشه
دوم ممکنه ابجکت های تکراری هم داشته باشم که ابجکت های تکراری تعدادش دقیقا باید مثل دیتابیس باشه
ممنون میشم منو راهنمایی کنین
با توجه به منطق کار می تونید از روشهای مختلفی استفاده کنید.
برای نمونه این یک روش برای مقایسه دو آرایه است.
function call_back_function($i,$j) {
if ($i === $j) {
return 0;
}
return 1;
}
$array1 = array("name"=>"mehran","local"=>"fa","type"=>"guest","phone"=>"09xxxxxx");
$array2 = array("name"=>"ali","local"=>"en","type"=>"guest","phone"=>"09xxxxxx");
print_r(array_udiff_assoc($array1,$array2,"call_back_function"));
در این مثال کلید و مقدار نام و لوکال به عنوان اختلاف برگشت داده میشه.
سلام
در مورد نکته اول شما باید تا حد ممکن یک وحدت رویه و انظباط در ارسال و دریافت ها ایجاد کنید با این حال می تونید بر اساس key آرایه ارسالی ابتدا یک مرتب سازی انجام بدید بعد ذخیر سازی کنید این طور وقتی بخواهید مقایسه کنید وقتی اطلاعات ارسالی جدید رو مرتب می کنید اطمینان دارید با یک نمونه مرتب شده دیگه مقایسه خواهد شد.
برای نکته دوم نیز توابع مربوط به آرایه ها هم مقایسه هم شمارش تکرار رو به راحتی پوشش میدن فقط باید دقت کنید هر تابعی رو در جای مناسب خودش استفاده کنید.
در اینجور حالت ها یه راه حل اینه که مقداری که بصورت json در دیتابیس ذخیره شده رو decode کنید و در یک متغییر ذخیره کنید
سپس به سادگی مقادیر جدیدی که کاربر وارد کرده در اون آرایه آپدیت کنید و دوباره اون رو به json encode کنید و ذخیره کنید.
مثلا این مقدار ذخیره شده در دیتابیس هست:
{"name":"mehran","local":"fa","type":"guest","phone":"09xxxxxx"}
این رو میشه با
json_decode($raw_data)
به آرایه تبدیل کنید که میشه :
array:4 [▼
"name" => "mehran"
"local" => "fa"
"type" => "guest"
"phone" => "09xxxxxx"
]
حالا مثلا میخوایید فیلد local رو تغییر بدید
$array['local'] = 'en';
و در نهایت هم دوباره به json بر میگردونید و ذخیره میکنید
json_encode($array);
@mehranmarandi90
ممنون از شما
مشکل من تبدیل جیسون به آرایه نیست. میخوام دوتا آرایه که مقادیرش آبجکت های حیسون هستن رو مقایسه کنم.
@hekmati
ممنون از شما
مرتب سازی رو متوجه نشدم
فرض کنید آرایه من به شکل زیر باشه :
[
{"name":"mehran","local":"fa","type":"guest","phone":"09xxxxxx"}
{"name":"mehran","local":"fa","type":"guest","phone":"09xxxxxx"}
{"name":"ali","local":"en","type":"guest","phone":"09xxxxxx"}
]
بر چه اساس مرتبشون کنم چون احتمال وجود فیلد یا ابجکت تکراری هم هست
اگر میخوایید با کوئری تفاوت رو پیدا کنید بعید میدونم راه استانداری وجود داشته باشه، چون شما دیتا code شده رو در دیتابیس ذخیره کردید و روی دیتای کد شده نمیشه کوئری زدی و نتیجه دقیقی گرفت
پس از برگردوندنش به آرایه میشه مقایسه هایی انجام داد ولی باز اگر Array in array وجود داشته باشه ممکن نمیشه.
@mehranmarandi90
منظورم همون مقایسه ش به صورت غیر دیتابیسی هست (بدون کوئری)
میخوام دقیق همه فیلدا بررسی بشن که یکسانند اگه ابجکتی مثلا دوبار تکرار شده بود توی دیتابیس هم همین مقدار باشه نه بیشتر و نه کمتر
ابتدا مشخص کنید که چرا رکورد تکراری وجود داره؟ اگر الزامی نداره که ابتدا یونیک بودن رکورد پیاده سازی بشه بعد مراحل دیگه
یه لیست از key ها ایجاد کنید ، array_keys فکر می کنم این کار رو می کرد ، بعد داخل یه حلقه ( بعد تبدیل json به آرایه ) foreach که همون آرایه key های ما رو پیمایش می کنه : چک کنید ببینید به طور مثال $b[$key] == a[$key]$
@hekmati
یه سرور خارجی با اندپوینت ما به این صورت کار میکنه و امکان تغییر از سمت اونا نیست و مشکل اینجاست که گفتن این مورد چک بشه.
@thevilgh
فرض کنید آرایه اول داخل دیتابیس ذخیره شد و آرایه دوم ورودی کاربره، دوتا آرایه زیر رو چجوری باهم مقایسه میکنید که با هم مساوی باشن ؟
[
{"name":"mehran","local":"fa","type":"guest","phone":"09xxxxxx"}
{"name":"mehran","local":"fa","type":"guest","phone":"09xxxxxx"}
{"name":"ali","local":"en","type":"guest","phone":"09xxxxxx"}
]
[
{"name":"mehran","local":"fa","type":"guest","phone":"09xxxxxx"}
{"name":"ali","local":"en","type":"guest","phone":"09xxxxxx"}
{"name":"mehran","local":"fa","type":"guest","phone":"09xxxxxx"}
]
خوب تا اینجا فرمت کار مشخص شد حالا بفرمایید در عملیات مقایسه چه کاری باید انجام بشه، مثلا سرور خارجی یه لیست در اختیار شما قرار میده بعد شما باید آیتم هاش رو بررسی کنید و به شرط غیر تکراری با دیتا خودتون، اطلاعات رو ارسال کنید؟
منظق کار رو هم توضیح بدید. بعد از تشخیص مساوی بدون دو رکورد چه کاری باید انجام بشه؟
@hekmati
ما یه عملیات ثبت دیتا داریم که دیتا توی دیتابیس سیو میشه (اطلاعات دیتابیس شرکت رو نمیتونم بفرستم و دیتای بالا رو بصورت نمونه فرستادم) که ارایه توی دیتابیس ذخیره میشه
یه عملیات کنسل داریم که برای اینکه مطمئن بشن دوباره همون آرایه ها رو میفرستن (مثل پاک کردن ریپازیتوری تو گیتلب گه کاربر باید اسم ریپوزیتوریش رو قبل پاک کردن بفرسته)
به نظر خودم به این عملیات احتیاج نیست و با ساخت یه توکن یا uuid میشه این موضوع رو حل کرد اما از من خواستن . راستش منطقش رو نمی دونم
موقع عملیات ثبت دیتا برامون مهم نیست ابجکت تکراری بفرسته یا نه. آبجکت هایی که موقع کنسل میفرستن باید با ابجکت های داخل دیتابیس یکی باشن که بعد از ولیدیت و بررسی عملیات کنسل انجام بشه
@sjavadez همونطور که گفتم فیلد هایی که میخواهید مقایسه بشن رو در آرایه ای ذخیره کنید مثلا :
$keys = ['key1' , 'key2'];
بعد با یه foreach ارایه رو پیمایش کنید و چک کنید اگه هر کدوم نامساوی شدن یعنی دو تا آرایه با هم یکسان نیستن . مثل :
$is_equal = true;
foreach($keys as $key){
if($db[$key] != $user[$key]){
$is_equal = false;
}
}
با توجه به منطق کار می تونید از روشهای مختلفی استفاده کنید.
برای نمونه این یک روش برای مقایسه دو آرایه است.
function call_back_function($i,$j) {
if ($i === $j) {
return 0;
}
return 1;
}
$array1 = array("name"=>"mehran","local"=>"fa","type"=>"guest","phone"=>"09xxxxxx");
$array2 = array("name"=>"ali","local"=>"en","type"=>"guest","phone"=>"09xxxxxx");
print_r(array_udiff_assoc($array1,$array2,"call_back_function"));
در این مثال کلید و مقدار نام و لوکال به عنوان اختلاف برگشت داده میشه.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟