Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

เรียงลำดับ Multidimensional Array หลาย Key ใน PHP

ใช้ 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);