function bubble_sort(array $array, ?string $key = null): array {
$count = count($array);
if ($count < 2) return $array;
for ($i = 0; $i < $count; $i++) {
for ($j = $count - 1; $j > $i; $j--) {
$valJ = $key ? ($array[$j][$key] ?? null) : $array[$j];
$valJ_1 = $key ? ($array[$j-1][$key] ?? null) : $array[$j-1];
if ($valJ !== null && $valJ_1 !== null && $valJ < $valJ_1) {
[$array[$j], $array[$j-1]] = [$array[$j-1], $array[$j]]; // PHP 7.1+ 解構賦值
}
}
}
return $array;
}
複雜度: O(n²),僅供學習算法原理,生產環境嚴禁使用。
$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. 提取排序列 (PHP 5.5+ array_column)
$volume = array_column($data, 'volume');
$edition = array_column($data, 'edition');
// 2. 多字段排序:volume 降序,edition 升序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
// 結果:volume 98→86→86→85→67→67;同 volume 時 edition 1→6→2→7
| 函數 | 說明 | 鍵名 | 示例 |
|---|---|---|---|
| sort() | 值升序 | 重建 0..n | sort($arr) |
| rsort() | 值降序 | 重建 | rsort($arr) |
| asort() | 值升序 | 保留關聯 | asort($arr) |
| arsort() | 值降序 | 保留關聯 | arsort($arr) |
| ksort() | 鍵名升序 | 保留 | ksort($arr) |
| krsort() | 鍵名降序 | 保留 | krsort($arr) |
| shuffle() | 隨機打亂 | 重建 | shuffle($arr) |
| array_reverse() | 反轉順序 | 保留 | array_reverse($arr) |
$users = [
['name'=>'A', 'age'=>25, 'score'=>90],
['name'=>'B', 'age'=>20, 'score'=>95],
['name'=>'C', 'age'=>25, 'score'=>85],
];
// 年齡升序,同齡分數降序
uasort($users, fn($a, $b) =>
($a['age'] <=> $b['age']) ?: ($b['score'] <=> $a['score'])
);
// 保留鍵名,適用關聯數組
function sortArray(array $array, bool $asc = true): array {
$values = array_values($array);
$result = [];
while ($values) {
$extreme = $asc ? min($values) : max($values);
$key = array_search($extreme, $values, true);
$result[] = $extreme;
unset($values[$key]);
$values = array_values($values); // 重建索引
}
return $result;
}
// 用法
$nums = [100, 1000, 1, 10000];
print_r(sortArray($nums, false)); // 降序:10000, 1000, 100, 1
sort/asort/ksort 族array_multisort + array_column 最優uasort + 太空船操作符 代碼最簡潔