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

PHP 陣列按字串長度排序:usort 自定義排序完全指南

     編輯:PHP 相關知識

需求背景:為何需要按字串長度排序?

在搜尋引擎、關鍵字高亮、文字分析等場景中,常需依據字串長度對陣列排序。例如搜尋「紅」時,《紅》比《小紅帽》更相關(關鍵字佔比更高)。PHP 內建排序函數(如 sort()、asort())僅支援字母順序,無法直接實現長度排序,此時 usort() 成為關鍵工具。

usort 核心機制

bool usort ( array &$array , callable $callback )
  • 參數:引用傳遞的陣列、比較回呼函數
  • 回呼規則:接受兩個參數 $a、$b,返回:
    • 負數:$a 排在 $b 前面
    • 零:順序不變
    • 正數:$a 排在 $b 後面
  • 底層邏輯:類似冒泡排序,透過兩兩比較交換位置達到全域有序

實作範例:由短到長 / 由長到短

基本版:使用 create_function (PHP 5.3-7.3)

<?php
$aS = ['aaa', 'aa', 'aaaa', 'aaaaa'];

// 由短到長
$asc = create_function('$a,$b', 'return strlen($a) - strlen($b);');
usort($aS, $asc);
// 結果:['aa', 'aaa', 'aaaa', 'aaaaa']

// 由長到短
$desc = create_function('$a,$b', 'return strlen($b) - strlen($a);');
usort($aS, $desc);
// 結果:['aaaaa', 'aaaa', 'aaa', 'aa']
?>

現代寫法:匿名函數 / 箭頭函數 (PHP 7.4+)

<?php
$words = ['PHP', 'JavaScript', 'Go', 'Rust', 'TypeScript'];

// 由短到長(箭頭函數自動返回運算式結果)
usort($words, fn($a, $b) => strlen($a) - strlen($b));
// ['Go', 'PHP', 'Rust', 'JavaScript', 'TypeScript']

// 由長到短
usort($words, fn($a, $b) => strlen($b) - strlen($a));
// ['TypeScript', 'JavaScript', 'Rust', 'PHP', 'Go']
?>

進階應用:多條件複合排序

若長度相同需再按字母序排序:

<?php
$items = ['cat', 'bat', 'apple', 'dog', 'ant'];

usort($items, function($a, $b) {
    $lenDiff = strlen($a) - strlen($b);
    if ($lenDiff !== 0) return $lenDiff;
    return strcmp($a, $b); // 長度相同時按 ASCII 升序
});
/*
結果:
['ant', 'bat', 'cat', 'dog', 'apple']
長度 3 的先按字母序,長度 5 的最後
*/
?>

效能考量與替代方案

  • usort() 平均時間複雜度 O(n log n),但回呼函數開銷較大
  • 大量資料(>10萬筆)建議:
    • 預先計算長度存入鍵值陣列,用 array_multisort()
    • 或使用 SplFixedArray + 自定義快速排序
  • PHP 8.0+ 可搭配 str_contains() 等新函數做更複雜的語意排序

總結

掌握 usort() 搭配 strlen() 的組合技,能靈活解決各類字串長度排序需求。現代 PHP 版本請優先使用箭頭函數,代碼更簡潔、效能更佳。下次遇到「按關鍵字密度排序」、「依標題長度截斷」等需求,這招絕對派得上用場。

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