Javad Ezaz
3 سال پیش توسط Javad Ezaz مطرح شد
14 پاسخ

مقایسه دو آرایه

سلام دوستان
میخوام بدونم منطق شما برای حل مسئله مقایسه دو آرایه توی لاراول چیه
من توی دیتابیسم آرایه ای از یک آبجکت json دارم که میخوام یکسری از فیلدهای اون با فیلدهای آرایه ای که از سمت کاربر میاد مقایسه شه (هم تعداد و هم مقادیر فیلد). درست مثل یه چک لیست
چنتا چالش دارم
اول ممکنه کاربر آبجکت ها رو نا مرتب بفرسته و ترتیبش مثل فیلدهای دیتابیس نباشه
دوم ممکنه ابجکت های تکراری هم داشته باشم که ابجکت های تکراری تعدادش دقیقا باید مثل دیتابیس باشه

ممنون میشم منو راهنمایی کنین


ثبت پرسش جدید
حسن حکمتی
تخصص : برنامه نویس وب و بلاکچین
@hekmati 3 سال پیش آپدیت شد
0

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

برای نمونه این یک روش برای مقایسه دو آرایه است.

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"));

در این مثال کلید و مقدار نام و لوکال به عنوان اختلاف برگشت داده میشه.


حسن حکمتی
تخصص : برنامه نویس وب و بلاکچین
@hekmati 3 سال پیش مطرح شد
0

سلام
در مورد نکته اول شما باید تا حد ممکن یک وحدت رویه و انظباط در ارسال و دریافت ها ایجاد کنید با این حال می تونید بر اساس key آرایه ارسالی ابتدا یک مرتب سازی انجام بدید بعد ذخیر سازی کنید این طور وقتی بخواهید مقایسه کنید وقتی اطلاعات ارسالی جدید رو مرتب می کنید اطمینان دارید با یک نمونه مرتب شده دیگه مقایسه خواهد شد.
برای نکته دوم نیز توابع مربوط به آرایه ها هم مقایسه هم شمارش تکرار رو به راحتی پوشش میدن فقط باید دقت کنید هر تابعی رو در جای مناسب خودش استفاده کنید.


مهران مرندی
تخصص : برنامه نویس
@mehranmarandi 3 سال پیش آپدیت شد
-1

در اینجور حالت ها یه راه حل اینه که مقداری که بصورت 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);

Javad Ezaz
تخصص : برنامه نویس php و لاراول
@sjavadez 3 سال پیش مطرح شد
0

@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"}
]

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


مهران مرندی
تخصص : برنامه نویس
@mehranmarandi 3 سال پیش آپدیت شد
-1

اگر میخوایید با کوئری تفاوت رو پیدا کنید بعید میدونم راه استانداری وجود داشته باشه، چون شما دیتا code شده رو در دیتابیس ذخیره کردید و روی دیتای کد شده نمیشه کوئری زدی و نتیجه دقیقی گرفت
پس از برگردوندنش به آرایه میشه مقایسه هایی انجام داد ولی باز اگر Array in array وجود داشته باشه ممکن نمیشه.


Javad Ezaz
تخصص : برنامه نویس php و لاراول
@sjavadez 3 سال پیش مطرح شد
0

@mehranmarandi90
منظورم همون مقایسه ش به صورت غیر دیتابیسی هست (بدون کوئری)
میخوام دقیق همه فیلدا بررسی بشن که یکسانند اگه ابجکتی مثلا دوبار تکرار شده بود توی دیتابیس هم همین مقدار باشه نه بیشتر و نه کمتر


حسن حکمتی
تخصص : برنامه نویس وب و بلاکچین
@hekmati 3 سال پیش مطرح شد
0

ابتدا مشخص کنید که چرا رکورد تکراری وجود داره؟ اگر الزامی نداره که ابتدا یونیک بودن رکورد پیاده سازی بشه بعد مراحل دیگه


thevil
تخصص : برنامه نویس خسته
@thevilgh 3 سال پیش مطرح شد
0

یه لیست از key ها ایجاد کنید ، array_keys فکر می کنم این کار رو می کرد ، بعد داخل یه حلقه ( بعد تبدیل json به آرایه ) foreach که همون آرایه key های ما رو پیمایش می کنه : چک کنید ببینید به طور مثال $b[$key] == a[$key]$


Javad Ezaz
تخصص : برنامه نویس php و لاراول
@sjavadez 3 سال پیش مطرح شد
0

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

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


Javad Ezaz
تخصص : برنامه نویس php و لاراول
@sjavadez 3 سال پیش مطرح شد
0

@hekmati
ما یه عملیات ثبت دیتا داریم که دیتا توی دیتابیس سیو میشه (اطلاعات دیتابیس شرکت رو نمیتونم بفرستم و دیتای بالا رو بصورت نمونه فرستادم) که ارایه توی دیتابیس ذخیره میشه
یه عملیات کنسل داریم که برای اینکه مطمئن بشن دوباره همون آرایه ها رو میفرستن (مثل پاک کردن ریپازیتوری تو گیتلب گه کاربر باید اسم ریپوزیتوریش رو قبل پاک کردن بفرسته)
به نظر خودم به این عملیات احتیاج نیست و با ساخت یه توکن یا uuid میشه این موضوع رو حل کرد اما از من خواستن . راستش منطقش رو نمی دونم
موقع عملیات ثبت دیتا برامون مهم نیست ابجکت تکراری بفرسته یا نه. آبجکت هایی که موقع کنسل میفرستن باید با ابجکت های داخل دیتابیس یکی باشن که بعد از ولیدیت و بررسی عملیات کنسل انجام بشه


thevil
تخصص : برنامه نویس خسته
@thevilgh 3 سال پیش مطرح شد
0

@sjavadez همونطور که گفتم فیلد هایی که میخواهید مقایسه بشن رو در آرایه ای ذخیره کنید مثلا :

 $keys = ['key1' , 'key2']; 

بعد با یه foreach ارایه رو پیمایش کنید و چک کنید اگه هر کدوم نامساوی شدن یعنی دو تا آرایه با هم یکسان نیستن . مثل :

$is_equal = true;
foreach($keys as $key){
    if($db[$key] != $user[$key]){
        $is_equal = false;
    }
}

حسن حکمتی
تخصص : برنامه نویس وب و بلاکچین
@hekmati 3 سال پیش آپدیت شد
0

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

برای نمونه این یک روش برای مقایسه دو آرایه است.

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"));

در این مثال کلید و مقدار نام و لوکال به عنوان اختلاف برگشت داده میشه.


Javad Ezaz
تخصص : برنامه نویس php و لاراول
@sjavadez 3 سال پیش مطرح شد
0

@hekmati
ممنون از شما


حسن حکمتی
تخصص : برنامه نویس وب و بلاکچین
@hekmati 3 سال پیش مطرح شد
0

خواهش میکنم
@sjavadez


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

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