بخش هشتم: مرتب‌سازی آرایه‌ها

۸-۱. مفهوم مرتب‌سازی

مرتب‌سازی به معنای چیدن عناصر آرایه بر اساس یک نظم مشخص است؛ مثلاً از کوچک به بزرگ، از بزرگ به کوچک یا بر اساس حروف الفبا. PHP مجموعه‌ای از توابع آماده برای مرتب‌سازی آرایه‌ها دارد. این توابع به دو دسته کلی تقسیم می‌شوند:

  • توابعی که آرایه اصلی را تغییر می‌دهند (مانند sort، rsort، asort، ksort).
  • توابعی که آرایه جدید مرتب‌شده برمی‌گردانند (مانند array_multisort در برخی حالت‌ها و توابع سفارشی).

در این بخش، پرکاربردترین توابع مرتب‌سازی معرفی می‌شوند.

۸-۲. تابع sort

عناصر آرایه را از کوچک به بزرگ (صعودی) مرتب می‌کند. این تابع کلیدها را حذف می‌کند و کلیدهای عددی جدید از صفر می‌سازد.

<?php
$numbers = [40, 10, 30, 20];
sort($numbers);

print_r($numbers);
?>

خروجی:

Array
(
    [0] => 10
    [1] => 20
    [2] => 30
    [3] => 40
)

مرتب‌سازی رشته‌ها

<?php
$colors = ["زرد", "آبی", "قرمز"];
sort($colors);
print_r($colors);
?>

نکته: sort برای آرایه‌های انجمنی مناسب نیست، زیرا کلیدها را از بین می‌برد.

۸-۳. تابع rsort

عناصر آرایه را از بزرگ به کوچک (نزولی) مرتب می‌کند. مانند sort، کلیدها را حذف می‌کند.

<?php
$numbers = [40, 10, 30, 20];
rsort($numbers);

print_r($numbers);
?>

خروجی:

Array
(
    [0] => 40
    [1] => 30
    [2] => 20
    [3] => 10
)

۸-۴. تابع asort

آرایه را بر اساس مقدارها به‌صورت صعودی مرتب می‌کند، اما کلیدها را حفظ می‌کند. این تابع برای آرایه‌های انجمنی مناسب است.

<?php
$ages = [
    "علی"  => 17,
    "رضا"  => 20,
    "مریم" => 16
];

asort($ages);

print_r($ages);
?>

خروجی:

Array
(
    [مریم] => 16
    [علی] => 17
    [رضا] => 20
)

۸-۵. تابع arsort

آرایه را بر اساس مقدارها به‌صورت نزولی مرتب می‌کند و کلیدها را حفظ می‌کند.

<?php
$ages = [
    "علی"  => 17,
    "رضا"  => 20,
    "مریم" => 16
];

arsort($ages);

print_r($ages);
?>

خروجی:

Array
(
    [رضا] => 20
    [علی] => 17
    [مریم] => 16
)

۸-۶. تابع ksort

آرایه را بر اساس کلیدها به‌صورت صعودی مرتب می‌کند.

<?php
$student = [
    "name"  => "علی",
    "age"   => 17,
    "field" => "کامپیوتر"
];

ksort($student);

print_r($student);
?>

خروجی:

Array
(
    [age] => 17
    [field] => کامپیوتر
    [name] => علی
)

۸-۷. تابع krsort

آرایه را بر اساس کلیدها به‌صورت نزولی مرتب می‌کند.

<?php
$student = [
    "name"  => "علی",
    "age"   => 17,
    "field" => "کامپیوتر"
];

krsort($student);

print_r($student);
?>

خروجی:

Array
(
    [name] => علی
    [field] => کامپیوتر
    [age] => 17
)

۸-۸. تابع usort

آرایه را با استفاده از یک تابع مقایسه سفارشی مرتب می‌کند. این تابع کلیدها را حذف می‌کند.

<?php
$numbers = [40, 10, 30, 20];

usort($numbers, function ($a, $b) {
    return $a - $b;
});

print_r($numbers);
?>

خروجی:

Array
(
    [0] => 10
    [1] => 20
    [2] => 30
    [3] => 40
)

نحوه کار تابع مقایسه

تابع مقایسه دو پارامتر می‌گیرد و باید:

  • عدد منفی برگرداند اگر $a کوچک‌تر از $b باشد.
  • صفر برگرداند اگر برابر باشند.
  • عدد مثبت برگرداند اگر $a بزرگ‌تر از $b باشد.

مرتب‌سازی نزولی با usort

<?php
usort($numbers, function ($a, $b) {
    return $b - $a;
});
?>

مرتب‌سازی آرایه دوبعدی با usort

<?php
$students = [
    ["name" => "علی", "age" => 17],
    ["name" => "رضا", "age" => 20],
    ["name" => "مریم", "age" => 16]
];

usort($students, function ($a, $b) {
    return $a["age"] - $b["age"];
});

print_r($students);
?>

مطالعه تکمیلی: در PHP 7 به بعد می‌توان از عملگر فضاپیما (<=>) برای مقایسه استفاده کرد:

<?php
usort($students, function ($a, $b) {
    return $a["age"] <=> $b["age"];
});
?>

این عملگر مقدار -1، 0 یا 1 برمی‌گرداند و کد را خواناتر می‌کند.

۸-۹. تابع uasort

مانند asort است، اما با تابع مقایسه سفارشی. کلیدها حفظ می‌شوند.

<?php
$ages = [
    "علی"  => 17,
    "رضا"  => 20,
    "مریم" => 16
];

uasort($ages, function ($a, $b) {
    return $a - $b;
});

print_r($ages);
?>

خروجی:

Array
(
    [مریم] => 16
    [علی] => 17
    [رضا] => 20
)

۸-۱۰. تابع uksort

آرایه را بر اساس کلیدها با تابع مقایسه سفارشی مرتب می‌کند.

<?php
$student = [
    "name"  => "علی",
    "age"   => 17,
    "field" => "کامپیوتر"
];

uksort($student, function ($a, $b) {
    return strcmp($a, $b);
});

print_r($student);
?>

مطالعه تکمیلی: تابع strcmp دو رشته را با هم مقایسه می‌کند و مقدار منفی، صفر یا مثبت برمی‌گرداند. برای مقایسه بدون حساسیت به حروف بزرگ و کوچک، از strcasecmp استفاده می‌شود.

۸-۱۱. تابع array_multisort

چند آرایه را همزمان مرتب می‌کند یا یک آرایه دوبعدی را بر اساس چند ستون مرتب می‌کند.

مرتب‌سازی یک آرایه

<?php
$numbers = [40, 10, 30, 20];
array_multisort($numbers);

print_r($numbers);
?>

مرتب‌سازی دو آرایه همزمان

<?php
$names = ["علی", "رضا", "مریم"];
$ages  = [17, 20, 16];

array_multisort($ages, SORT_ASC, $names, SORT_ASC);

print_r($names);
echo "<br>";
print_r($ages);
?>

مطالعه تکمیلی: array_multisort در پروژه‌های واقعی برای مرتب‌سازی جدول‌های چندستونی کاربرد دارد. ترتیب پارامترها اهمیت دارد و می‌توان برای هر آرایه جهت مرتب‌سازی (SORT_ASC یا SORT_DESC) و نوع مقایسه (SORT_NUMERIC، SORT_STRING و...) را تعیین کرد. این تابع برای دانش‌آموزان مبتدی کمی پیچیده است و در بیشتر موارد usort کافی است.

۸-۱۲. مقایسه توابع مرتب‌سازی

تابع مبنا جهت حفظ کلید مناسب برای
sort مقدار صعودی خیر آرایه اندیس‌دار
rsort مقدار نزولی خیر آرایه اندیس‌دار
asort مقدار صعودی بله آرایه انجمنی
arsort مقدار نزولی بله آرایه انجمنی
ksort کلید صعودی بله آرایه انجمنی
krsort کلید نزولی بله آرایه انجمنی
usort مقدار سفارشی دلخواه خیر آرایه اندیس‌دار
uasort مقدار سفارشی دلخواه بله آرایه انجمنی
uksort کلید سفارشی دلخواه بله آرایه انجمنی

۸-۱۳. مثال کامل

<?php
$products = [
    ["name" => "کیبورد", "price" => 450000],
    ["name" => "ماوس", "price" => 250000],
    ["name" => "مانیتور", "price" => 3500000]
];

usort($products, function ($a, $b) {
    return $a["price"] <=> $b["price"];
});

foreach ($products as $product) {
    echo $product["name"] . " : " . $product["price"] . " تومان<br>";
}
?>

خروجی:

ماوس : 250000 تومان
کیبورد : 450000 تومان
مانیتور : 3500000 تومان

۸-۱۴. نکات مهم

  1. sort و rsort کلیدها را حذف می‌کنند و برای آرایه انجمنی مناسب نیستند.
  2. asort و arsort مقدارها را مرتب می‌کنند و کلیدها را حفظ می‌کنند.
  3. ksort و krsort بر اساس کلیدها مرتب می‌کنند.
  4. usort، uasort و uksort با تابع مقایسه سفارشی کار می‌کنند.
  5. تابع مقایسه باید عدد منفی، صفر یا مثبت برگرداند.
  6. عملگر فضاپیما (<=>) مقایسه را ساده‌تر می‌کند.
  7. array_multisort برای مرتب‌سازی چند آرایه همزمان یا چند ستون مناسب است، اما پیچیده‌تر است.
  8. در بیشتر موارد، usort برای آرایه‌های دوبعدی و asort برای آرایه‌های انجمنی انتخاب مناسبی است.