後端獲取菜單、導航、商品列表等數據,需按 `order`、`sort`、`weight` 等字段排序後輸出前端。
['name' => '首頁', 'order' => 3],
'intro' => ['name' => '企業概況', 'order' => 2],
'news' => ['name' => '新聞動態', 'order' => 1],
'product' => ['name' => '產品中心', 'order' => 4],
'message' => ['name' => '訪客留言', 'order' => 7],
'position' => ['name' => '人才招聘', 'order' => 6],
'contact' => ['name' => '聯系我們', 'order' => 5],
];
// 升序排序(order 小 → 大)
uasort($menu, function ($a, $b) {
return $a['order'] <=> $b['order']; // PHP 7+ 太空船操作符
// 兼容寫法:return $a['order'] - $b['order'];
});
print_r($menu);
Array
(
[news] => Array ( [name] => 新聞動態 [order] => 1 )
[intro] => Array ( [name] => 企業概況 [order] => 2 )
[index] => Array ( [name] => 首頁 [order] => 3 )
[product] => Array ( [name] => 產品中心 [order] => 4 )
[contact] => Array ( [name] => 聯系我們 [order] => 5 )
[position] => Array ( [name] => 人才招聘 [order] => 6 )
[message] => Array ( [name] => 訪客留言 [order] => 7 )
)
/**
* 多維數組按指定鍵排序
* @param array $array 目標數組(引用)
* @param string $key 排序鍵名
* @param int $order SORT_ASC(升序) | SORT_DESC(降序)
* @param int $flags SORT_REGULAR | SORT_NUMERIC | SORT_STRING
* @return bool
*/
function array_multisort_by_key(array &$array, string $key, int $order = SORT_ASC, int $flags = SORT_REGULAR): bool {
if (empty($array) || !isset($array[array_key_first($array)][$key])) {
return false;
}
uasort($array, function ($a, $b) use ($key, $order, $flags) {
$cmp = 0;
switch ($flags) {
case SORT_NUMERIC:
$cmp = ($a[$key] ?? 0) <=> ($b[$key] ?? 0);
break;
case SORT_STRING:
$cmp = strcmp((string)($a[$key] ?? ''), (string)($b[$key] ?? ''));
break;
default:
$cmp = ($a[$key] ?? null) <=> ($b[$key] ?? null);
}
return $order === SORT_DESC ? -$cmp : $cmp;
});
return true;
}
// 使用示例
$products = [
['id'=>1, 'price'=>99.9, 'sales'=>100],
['id'=>2, 'price'=>199.0, 'sales'=>50],
['id'=>3, 'price'=>49.5, 'sales'=>200],
];
array_multisort_by_key($products, 'price', SORT_ASC, SORT_NUMERIC); // 價格升序
array_multisort_by_key($products, 'sales', SORT_DESC, SORT_NUMERIC); // 銷量降序
// 先按分類升序,再按價格降序
uasort($goods, function ($a, $b) {
$catCmp = ($a['category'] ?? '') <=> ($b['category'] ?? '');
if ($catCmp !== 0) return $catCmp;
return - (($a['price'] ?? 0) <=> ($b['price'] ?? 0)); // 價格降序取負
});
| 函數 | 是否保持鍵名 | 適用場景 | 複雜度 |
|---|---|---|---|
| sort() | ❌ 重建索引 | 純索引數組值排序 | O(n log n) |
| asort() | ✅ 保持鍵名 | 關聯數組值排序 | O(n log n) |
| ksort() | ✅ 保持鍵名 | 按鍵名排序 | O(n log n) |
| uasort() | ✅ 保持鍵名 | 自定義邏輯排序(最靈活) | O(n log n) |
| array_multisort() | ❌/✅ 視參數 | 多數組/多維同步排序 | O(n log n) |
掌握 uasort + 閉包比較函數,即可靈活應對各種多維數組排序需求,代碼簡潔且性能優異。