從不同表獲取數據合併後(array_merge),需按 create_time 降序取前 4 條。無法在 SQL 層面 ORDER BY,必須在 PHP 層排序。
<?php
$users = [
['id' => 1, 'name' => '張三', 'age' => 25],
['id' => 2, 'name' => '李四', 'age' => 23],
['id' => 3, 'name' => '王五', 'age' => 40],
['id' => 4, 'name' => '趙六', 'age' => 31],
['id' => 5, 'name' => '黃七', 'age' => 20],
];
// 排序配置:支持多字段、混合升降序
$sort = [
'field' => 'age', // 排序字段
'direction' => 'SORT_DESC', // SORT_ASC 升序,SORT_DESC 降序
];
// 1. 提取排序列
$sortCol = [];
foreach ($users as $key => $row) {
$sortCol[$key] = $row[$sort['field']];
}
// 2. 執行排序(引用原數組)
array_multisort($sortCol, constant($sort['direction']), $users);
// 結果:age 20, 23, 25, 31, 40
var_dump($users);
如先按 age DESC,同年齡再按 name ASC:
$age = array_column($users, 'age');
$name = array_column($users, 'name');
array_multisort($age, SORT_DESC, $name, SORT_ASC, $users);
array_multisort() 接受多個「排序列數組」+「排序標志」對,最後一個參數為引用的原數組。constant('SORT_DESC') 將字符串轉為常量,便於配置化存儲。usort() 閉包寫法(PHP 5.3+)usort($users, function ($a, $b) {
// 年齡降序
if ($a['age'] !== $b['age']) return $b['age'] - $a['age'];
// 姓名升序
return strcmp($a['name'], $b['name']);
});
對比:usort 邏輯更靈活(可做複雜比較),但大數據量下 array_multisort 速度更快(C 層批量排序)。