首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 陣列鍵名升序排序 ksort() 完整指南:保留關聯鍵、語法參數與實戰應用

     編輯:PHP 相關知識

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
*/
?>

常見陷阱與注意事項

  1. 數字鍵名必須用 SORT_NUMERIC:否則 "10" < "2" (字串比較)
  2. 混合型別鍵名:PHP 8.1+ 拋出 Deprecation,建議統一鍵名型別
  3. 大小寫敏感:預設 'A' < 'a' (ASCII 65 < 97),需 SORT_FLAG_CASE 忽略
  4. 回傳值是 bool:$sorted = ksort($arr) 會得到 true,不是排序後陣列
  5. 物件不可直接排序:需轉陣列或實作 ArrayAccess

效能特徵

  • 時間複雜度:O(n log n)
  • 空間複雜度:O(1) 原地排序
  • 適用規模:百萬鍵級約 0.2-0.5 秒
  • 比 usort() 快 (內建 C 實現 vs 使用者回呼)

總結

ksort() 是 PHP 關聯陣列**鍵名升序排序**的標準工具,核心優勢在於**完整保留鍵值對應**。關鍵使用要點:數字鍵加 SORT_NUMERIC、版本號用 SORT_NATURAL、API 簽名確保確定性順序。搭配 krsort() (降序)、uksort() (自訂),涵蓋所有鍵名排序需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved