| 函數 | 排序依據 | 保留鍵值 | 順序 |
|---|---|---|---|
sort() | 值 | ❌ 重置索引 | 升序 |
rsort() | 值 | ❌ | 降序 |
asort() | 值 | ✅ | 升序 |
arsort() | 值 | ✅ | 降序 |
ksort() | 鍵 | ✅ | 升序 |
krsort() | 鍵 | ✅ | 降序 |
natsort() | 值(自然排序) | ✅ | 升序 |
natcasesort() | 值(自然排序,大小寫不敏感) | ✅ | 升序 |
需求:根據子陣列的某個欄位(如 volume、edition)對父陣列排序。
<?php
$data = [
['volume' => 67, 'edition' => 2],
['volume' => 86, 'edition' => 1],
['volume' => 85, 'edition' => 6],
['volume' => 98, 'edition' => 2],
['volume' => 86, 'edition' => 6],
['volume' => 67, 'edition' => 7],
];
// 1. 提取排序欄位
$volumes = array_column($data, 'volume');
$editions = array_column($data, 'edition');
// 2. 多欄位排序:volume 降序、edition 升序
// 最後一個參數必須是原陣列(傳址)
array_multisort($volumes, SORT_DESC, $editions, SORT_ASC, $data);
print_r($data);
/*
Array
(
[0] => Array ( [volume] => 98 [edition] => 2 )
[1] => Array ( [volume] => 86 [edition] => 1 )
[2] => Array ( [volume] => 86 [edition] => 6 )
[3] => Array ( [volume] => 85 [edition] => 6 )
[4] => Array ( [volume] => 67 [edition] => 2 )
[5] => Array ( [volume] => 67 [edition] => 7 )
)
*/
<?php
// 單欄位排序
usort($data, fn($a, $b) => $a['volume'] <=> $b['volume']); // 升序
usort($data, fn($a, $b) => $b['volume'] <=> $a['volume']); // 降序
// 多欄位排序(PHP 7+ 太空船運算子)
usort($data, function($a, $b) {
// volume 降序
$vol = $b['volume'] <=> $a['volume'];
if ($vol !== 0) return $vol;
// edition 升序
return $a['edition'] <=> $b['edition'];
});
<?php
/**
* 二維陣列多欄位排序
* @param array &$data 待排序陣列(傳址修改)
* @param array $sortSpecs 排序規則 [['field' => 'volume', 'order' => SORT_DESC], ...]
*/
function multiSort(array &$data, array $sortSpecs): void
{
$args = [];
foreach ($sortSpecs as $spec) {
$field = $spec['field'];
$order = $spec['order'] ?? SORT_ASC;
$flags = $spec['flags'] ?? SORT_REGULAR;
$args[] = array_column($data, $field);
$args[] = $order;
$args[] = $flags;
}
$args[] = &$data; // 關鍵:原陣列傳址
array_multisort(...$args);
}
// 使用
multiSort($data, [
['field' => 'volume', 'order' => SORT_DESC],
['field' => 'edition', 'order' => SORT_ASC],
]);
<?php
function bubble_sort($array, $key = null) {
$count = count($array);
if ($count <= 1) return $array;
for ($i = 0; $i < $count; $i++) {
for ($j = $count - 1; $j > $i; $j--) {
$compare = $key
? ($array[$j][$key] ?? null) <=> ($array[$j-1][$key] ?? null)
: $array[$j] <=> $array[$j-1];
if ($compare < 0) {
[$array[$j], $array[$j-1]] = [$array[$j-1], $array[$j]];
}
}
}
return $array;
}
時間複雜度 O(n²),僅適合極小資料量(<50)教學演示。生產環境嚴禁使用,請用 array_multisort 或 usort(O(n log n))。
sort()/asort()/ksort() 系列usort() + 箭頭函數最簡潔array_multisort() 效能最佳;或封裝 multiSort() 複用ORDER BY 完成排序,避免記憶體壓力