تابع array_unique() در 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() ابزاری عملیاتی و ساده برای حذف مقادیر تکراری است؛ با درک رفتار تبدیل نوع، فلگها و محدودیتها میتوانید از آن در سناریوهای واقعی با اطمینان استفاده کنید.
آیا این مطلب برای شما مفید بود ؟



