ویژگی تصویر

تابع array_unique() در PHP

  /  PHP   /  تابع array_unique() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع array_unique() در PHP یکی از توابع مفید برای حذف مقادیر تکراری از یک آرایه است. این تابع مقادیر تکراری را برمی‌دارد و تنها اولین مقدار برای هر مقدار یکتا را نگه می‌دارد. در این مقاله به شکل دقیق، مثال‌های عملی، نکات پیشرفته و شیوه‌های بهینه‌سازی استفاده از تابع array_unique() را بررسی می‌کنیم.

تاریخچه و رفتار کلی

array_unique() در نسخه‌های قدیمی و جدید PHP موجود است و رفتار استانداردی دارد: مقادیر آرایه را با تبدیل به رشته (به‌صورت پیش‌فرض) مقایسه می‌کند و تنها اولین مقدار هر «مقدار منحصربه‌فرد» را نگه می‌دارد. کلیدهای (keys) اصلی آرایه را حفظ می‌کند مگر اینکه عملیات دیگری انجام شود.

سینتکس

array_unique(array $array, int $sort_flags = SORT_STRING): array

پارامترها:

  • $array: آرایه‌ای که قرار است تکراری‌ها از آن حذف شود.
  • $sort_flags: یک فلگ اختیاری که نوع مقایسه را مشخص می‌کند (مثل SORT_REGULAR، SORT_NUMERIC، SORT_STRING، SORT_LOCALE_STRING).

مثال ساده

$input = array(1, 2, 2, 3, "3", "a", "a");
$result = array_unique($input);
print_r($result);

خروجی این کد:

Array
(
    [0] => 1
    [1] => 2
    [3] => 3
    [5] => a
)

توضیح: تابع، اولین وقوع هر مقدار را نگه می‌دارد و کلیدهای اولیه را حفظ می‌کند. توجه کنید که عدد 3 و رشته “3” با مقدار پیش‌فرض SORT_STRING ممکن است یکی محسوب شوند (بستگی به فلگ دارد).

فلگ‌های مقایسه و مثال‌ها

چهار فلگ اصلی:

  • SORT_REGULAR: مقایسه عادی (بدون تبدیل نوع).
  • SORT_NUMERIC: مقایسه عددی.
  • SORT_STRING: مقایسه به صورت رشته‌ای (پیش‌فرض).
  • SORT_LOCALE_STRING: مقایسه بر اساس locale فعلی.
$arr = array(1, "1", 2, "2");
$r1 = array_unique($arr, SORT_REGULAR);
$r2 = array_unique($arr, SORT_STRING);
$r3 = array_unique($arr, SORT_NUMERIC);

print_r($r1);
print_r($r2);
print_r($r3);

توضیح: با SORT_REGULAR عدد 1 و رشته “1” متفاوت در نظر گرفته می‌شوند؛ با SORT_STRING و SORT_NUMERIC ممکن است یکی انگاشته شوند. انتخاب فلگ مناسب اهمیت زیادی دارد.

حفظ کلیدها و بازشماره کردن شاخص‌ها

تابع array_unique کلیدهای آرایه را حفظ می‌کند. اگر نیاز به آرایه‌ای با شاخص‌های متوالی (0,1,2,…) دارید، از array_values استفاده کنید:

$input = array(0 => 'a', 2 => 'b', 5 => 'a');
$unique = array_unique($input);
$reindexed = array_values($unique);

در این مثال، $unique کلیدهای 0 و 2 و 5 را نگه می‌دارد، اما $reindexed آرایه‌ای با کلیدهای مجدد (0,1) خواهد بود.

حذف تکراری‌ها در آرایه‌های چندبعدی

array_unique تنها برای آرایه‌های تک‌بعدی مفید است. برای آرایه‌های چندبعدی باید ابتدا هر سطر را به یک رشته تبدیل کنید (با serialize یا json_encode) و سپس تکراری‌ها را حذف و دوباره بازسازی کنید:

$multi = [
  ['id'=>1,'name'=>'Ali'],
  ['id'=>2,'name'=>'Sara'],
  ['id'=>1,'name'=>'Ali']
];
// روش با serialize
$temp = array_map('serialize', $multi);
$unique_temp = array_unique($temp);
$result = array_map('unserialize', $unique_temp);
print_r($result);

توضیح: ابتدا هر سطر با serialize به رشته تبدیل می‌شود، سپس array_unique تکراری‌ها را حذف می‌کند و در نهایت با unserialize آرایهٔ اولیه بازسازی می‌شود. این روش برای حذف رکوردهای تکراری در آرایه‌های پیچیده کاراست.

حذف تکراری رشته‌ها به صورت غیرحساس به حروف بزرگ و کوچک

اگر بخواهیم حذف تکراری‌ها بدون حساسیت به حروف بزرگ/کوچک انجام شود، پیش‌پردازش لازم است:

$arr = ['A', 'a', 'B', 'b'];
$lower = array_map('mb_strtolower', $arr);
$uniqueKeys = array_unique($lower);
$result = [];
foreach ($uniqueKeys as $k => $v) {
    $result[] = $arr[$k];
}
print_r($result);

توضیح: ابتدا نسخهٔ کوچک‌شدهٔ رشته‌ها ساخته می‌شود، سپس از array_unique روی آن استفاده می‌کنیم تا اولین وقوع هر مقدار غیرحساس به حروف بزرگ/کوچک نگه داشته شود و در نهایت مقادیر اصلی (با حفظ ترتیب اولیه) استخراج می‌شوند.

موارد محدودیت و نکات عملکردی

  • array_unique رفتار تبدیل نوع دارد؛ بنابراین مراقب مقایسه اعداد و رشته‌ها باشید.
  • برای آرایه‌های بزرگ عملکرد خوب است ولی برای آرایه‌های خیلی بزرگ ممکن است حافظه مصرف شود—در این موارد می‌توان از راهکارهای streaming یا نگهداری وضعیت در دیتابیس استفاده کرد.
  • برای حذف تکراری روی اشیاء لازم است منطق اختصاصی بنویسید (مثلاً تبدیل به شناسه یا سریالایز کردن).

نمونه کاربردی: حذف تکراری‌ها از داده‌های فرم

فرض کنید داده‌هایی از یک فرم دریافت می‌کنید و باید ایمیل‌های تکراری را حذف کنید:

$emails = ['a@example.com','b@example.com','A@example.com','b@example.com'];
$normalized = array_map('strtolower', $emails);
$unique = array_unique($normalized);
$final = array_values($unique);
print_r($final);

توضیح: با strtolower حساسیت به حروف بزرگ/کوچک حذف می‌شود. سپس array_unique تکراری‌ها را می‌کشد و array_values ترتیب شاخص‌ها را بازنشانی می‌کند تا خروجی مرتب و مناسب برای ذخیره در دیتابیس باشد.

مقایسه با رویکردهای دیگر

روشمزایامعایب
array_unique()ساده، سریع برای آرایه‌های تک‌بعدیحساس به تبدیل نوع، مناسب برای آرایه‌های پیچیده نیست
serialize + array_uniqueقابل استفاده برای آرایه‌های چندبعدیهزینهٔ حافظه/CPU بالاتر
custom loopکنترل کامل، قابل تغییر برای حساسیت به حروف و مقایسه سفارشیپیاده‌سازی طولانی‌تر

نکات نهایی و بهترین شیوه‌ها

  • در انتخاب فلگ مقایسه دقت کنید (REGULAR/STRING/NUMERIC).
  • برای خروجی مرتب و بدون گپ از array_values استفاده کنید.
  • برای آرایه‌های پیچیده از serialize/json_encode استفاده کنید یا یک تابع مقایسه‌ای بنویسید.
  • برای کار با حجم بالا، پردازش دسته‌ای (batch) یا استفاده از دیتابیس به‌جای نگهداری همه در حافظه را در نظر بگیرید.

تابع array_unique() ابزاری عملیاتی و ساده برای حذف مقادیر تکراری است؛ با درک رفتار تبدیل نوع، فلگ‌ها و محدودیت‌ها می‌توانید از آن در سناریوهای واقعی با اطمینان استفاده کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: