ใช้ array_multisort() เพื่อเรียงลำดับ Array หลายมิติ โดยอ้างอิงหลาย Key พร้อมกัน (เช่น เรียง Event Type แล้วค่อย Title)
ตัวอย่างข้อมูล
$events = [
['id' => 1, 'title' => 'Data One', 'event_type' => 'one'],
['id' => 2, 'title' => 'Data Two', 'event_type' => 'zero'],
['id' => 3, 'title' => 'Data Three', 'event_type' => 'one'],
['id' => 4, 'title' => 'Data Four', 'event_type' => 'zero'],
];
วิธีที่ 1: แบบคลาสสิก (PHP ทุก Version)
// สร้าง Array ช่วยสำหรับ sorting
$sort = [];
foreach ($events as $key => $value) {
$sort['event_type'][$key] = $value['event_type'];
$sort['title'][$key] = $value['title'];
}
// เรียง: event_type DESC (zero ก่อน one), แล้ว title ASC
array_multisort(
$sort['event_type'], SORT_DESC,
$sort['title'], SORT_ASC,
$events
);
print_r($events);
วิธีที่ 2: ใช้ array_column (PHP 5.5+, สั้นกว่า)
array_multisort(
array_column($events, 'event_type'), SORT_DESC,
array_column($events, 'title'), SORT_ASC,
$events
);
วิธีที่ 3: ใช้ usort + Closure (PHP 7+, อ่านง่ายที่สุด)
usort($events, function($a, $b) {
// เรียง event_type DESC ก่อน
$cmp = strcmp($b['event_type'], $a['event_type']);
if ($cmp !== 0) return $cmp;
// ถ้า event_type เท่ากัน เรียง title ASC
return strcmp($a['title'], $b['title']);
});
ผลลัพธ์ (ทั้ง 3 วิธีเหมือนกัน)
Array
(
[0] => Array ( [id] => 4 [title] => Data Four [event_type] => zero )
[1] => Array ( [id] => 2 [title] => Data Two [event_type] => zero )
[2] => Array ( [id] => 1 [title] => Data One [event_type] => one )
[3] => Array ( [id] => 3 [title] => Data Three [event_type] => one )
)
การเรียงหลายเงื่อนไขขั้นสูง
$products = [
['name' => 'Apple', 'category' => 'Fruit', 'price' => 50, 'stock' => 100],
['name' => 'Banana', 'category' => 'Fruit', 'price' => 20, 'stock' => 50],
['name' => 'Carrot', 'category' => 'Veg', 'price' => 15, 'stock' => 200],
['name' => 'Beef', 'category' => 'Meat', 'price' => 200, 'stock' => 10],
];
// เรียง: Category ASC, Price DESC, Stock ASC
usort($products, function($a, $b) {
// Category ASC
$cmp = strcmp($a['category'], $b['category']);
if ($cmp !== 0) return $cmp;
// Price DESC (ราคาสูงก่อน)
$cmp = $b['price'] <=> $a['price']; // Spaceship operator (PHP 7+)
if ($cmp !== 0) return $cmp;
// Stock ASC
return $a['stock'] <=> $b['stock'];
});
เคล็ดลับ: Spaceship Operator (<=>) PHP 7+
// แทนที่ if/else ยาวๆ
$a <=> $b; // คืนค่า -1, 0, 1
// ตัวอย่าง: เรียงตัวเลข DESC
usort($numbers, fn($a, $b) => $b <=> $a);
// เรียง String ASC
usort($strings, fn($a, $b) => $a <=> $b);