بخش هشتم: مرتبسازی آرایهها
۸-۱. مفهوم مرتبسازی
مرتبسازی به معنای چیدن عناصر آرایه بر اساس یک نظم مشخص است؛ مثلاً از کوچک به بزرگ، از بزرگ به کوچک یا بر اساس حروف الفبا. 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 تومان
۸-۱۴. نکات مهم
sortوrsortکلیدها را حذف میکنند و برای آرایه انجمنی مناسب نیستند.asortوarsortمقدارها را مرتب میکنند و کلیدها را حفظ میکنند.ksortوkrsortبر اساس کلیدها مرتب میکنند.usort،uasortوuksortبا تابع مقایسه سفارشی کار میکنند.- تابع مقایسه باید عدد منفی، صفر یا مثبت برگرداند.
- عملگر فضاپیما (
<=>) مقایسه را سادهتر میکند. array_multisortبرای مرتبسازی چند آرایه همزمان یا چند ستون مناسب است، اما پیچیدهتر است.- در بیشتر موارد،
usortبرای آرایههای دوبعدی وasortبرای آرایههای انجمنی انتخاب مناسبی است.