ksort() 核心特性一覽
ksort() 依**鍵名 (Key)** 將陣列由小到大排序 (升序),**完整保留鍵值對應關係**,是關聯陣列排序的首選工具。
| 特性 | 說明 |
| 排序依據 | 鍵名 |
| 排序方向 | 升序 (A-Z, 0-9) |
| 鍵名保留 | ✅ 完整保留關聯鍵 |
| 回傳值 | bool (成功 true / 失敗 false) |
| 原地操作 | 直接修改原陣列 |
語法與參數
ksort(array &$array, int $flags = SORT_REGULAR): bool
排序旗標 (同 rsort/asort 系列)
| 常數 | 行為 |
SORT_REGULAR | 預設,標準比較不轉型 |
SORT_NUMERIC | 鍵名視為數值比較 |
SORT_STRING | 鍵名視為字串比較 |
SORT_LOCALE_STRING | 依 locale 字串比較 |
SORT_NATURAL | 自然排序 (PHP 5.4+) |
SORT_FLAG_CASE | 忽略大小寫 (搭配 SORT_STRING) |
核心範例
基本字串鍵名排序
<?php
$my_array = ["e" => "Dog", "b" => "Cat", "c" => "Horse"];
ksort($my_array);
print_r($my_array);
/*
輸出:
Array
(
[b] => Cat
[c] => Horse
[e] => Dog
)
鍵名 b, c, e 按字母序排列,值隨鍵移動
*/
?>
數字鍵名排序 (需 SORT_NUMERIC)
<?php
$scores = [
100 => '完美',
10 => '及格',
1000 => '超越',
1 => '起步'
];
// 預設字串比較:1, 10, 100, 1000 (字典序)
ksort($scores);
print_r(array_keys($scores)); // [1, 10, 100, 1000] ← 意外正確!
// 但這樣不穩定:
$test = [2 => 'a', 10 => 'b'];
ksort($test);
print_r(array_keys($test)); // [10, 2] ← 字串 "10" < "2"!
// ✅ 正確:數值模式
ksort($scores, SORT_NUMERIC);
print_r(array_keys($scores)); // [1, 10, 100, 1000]
?>
自然排序應用 (檔案名、版本號)
<?php
$versions = [
'v1.10' => 'Release 1.10',
'v1.2' => 'Release 1.2',
'v1.1' => 'Release 1.1',
'v2.0' => 'Release 2.0',
];
ksort($versions, SORT_NATURAL | SORT_FLAG_CASE);
print_r(array_keys($versions));
// [v1.1, v1.2, v1.10, v2.0] ← 自然排序正確處理 1.2 < 1.10
?>
ksort() 族群對照表
| 函式 | 排序依據 | 方向 | 保留鍵值 |
ksort() | 鍵名 | 升序 | ✅ |
krsort() | 鍵名 | 降序 | ✅ |
asort() | 值 | 升序 | ✅ |
arsort() | 值 | 降序 | ✅ |
uksort() | 自訂鍵比較 | 自訂 | ✅ |
實戰應用場景
場景 1:輸出有序的設定/選項陣列
<?php
$config = [
'database.host' => 'localhost',
'app.debug' => true,
'cache.ttl' => 3600,
'app.name' => 'MyApp',
'database.port' => 3306,
];
ksort($config); // 依鍵名字母序輸出,便於閱讀/比對
foreach ($config as $key => $value) {
echo "$key = $value\n";
}
/*
輸出順序:
app.debug = 1
app.name = MyApp
cache.ttl = 3600
database.host = localhost
database.port = 3306
*/
?>
場景 2:建立確定性雜湊/簽名 (API 簽名)
<?php
function generateSignature(array $params, string $secret): string {
// 1. 依鍵名升序排序 (確保參數順序一致)
ksort($params, SORT_STRING);
// 2. 拼接字串
$query = http_build_query($params, '', '&', PHP_QUERY_RFC3986);
// 3. HMAC 簽名
return hash_hmac('sha256', $query, $secret);
}
$params = [
'timestamp' => 1700000000,
'nonce' => 'abc123',
'action' => 'pay',
];
$sig = generateSignature($params, 'secret_key');
// 相同參數永遠產生相同簽名,無論原始陣列順序
?>
場景 3:多維陣列按子鍵排序 (配合 array_multisort)
<?php
$users = [
['id' => 3, 'name' => 'Charlie', 'age' => 25],
['id' => 1, 'name' => 'Alice', 'age' => 30],
['id' => 2, 'name' => 'Bob', 'age' => 22],
];
// 依 id 升序 (id 是數字鍵)
array_multisort(array_column($users, 'id'), SORT_ASC, SORT_NUMERIC, $users);
// 或 PHP 7.4+ 箭頭函數
// array_multisort(array_column($users, 'id'), SORT_ASC, SORT_NUMERIC, $users);
print_r($users);
/*
依 id 排序後:
[id=1, Alice, 30], [id=2, Bob, 22], [id=3, Charlie, 25]
*/
?>
場景 4:遞迴排序多層關聯陣列
<?php
function deepKsort(array &$array): void {
ksort($array, SORT_STRING);
foreach ($array as &$value) {
if (is_array($value)) {
deepKsort($value);
}
}
}
$data = [
'zebra' => ['delta' => 4, 'alpha' => 1],
'apple' => ['gamma' => 3, 'beta' => 2],
];
deepKsort($data);
print_r($data);
/*
所有層級鍵名皆排序:
apple -> beta, gamma
zebra -> alpha, delta
*/
?>
常見陷阱與注意事項
- 數字鍵名必須用 SORT_NUMERIC:否則 "10" < "2" (字串比較)
- 混合型別鍵名:PHP 8.1+ 拋出 Deprecation,建議統一鍵名型別
- 大小寫敏感:預設 'A' < 'a' (ASCII 65 < 97),需
SORT_FLAG_CASE 忽略
- 回傳值是 bool:
$sorted = ksort($arr) 會得到 true,不是排序後陣列
- 物件不可直接排序:需轉陣列或實作
ArrayAccess
效能特徵
- 時間複雜度:O(n log n)
- 空間複雜度:O(1) 原地排序
- 適用規模:百萬鍵級約 0.2-0.5 秒
- 比
usort() 快 (內建 C 實現 vs 使用者回呼)
總結
ksort() 是 PHP 關聯陣列**鍵名升序排序**的標準工具,核心優勢在於**完整保留鍵值對應**。關鍵使用要點:數字鍵加 SORT_NUMERIC、版本號用 SORT_NATURAL、API 簽名確保確定性順序。搭配 krsort() (降序)、uksort() (自訂),涵蓋所有鍵名排序需求。