在搜尋引擎、關鍵字高亮、文字分析等場景中,常需依據字串長度對陣列排序。例如搜尋「紅」時,《紅》比《小紅帽》更相關(關鍵字佔比更高)。PHP 內建排序函數(如 sort()、asort())僅支援字母順序,無法直接實現長度排序,此時 usort() 成為關鍵工具。
bool usort ( array &$array , callable $callback )
$a、$b,返回:
$a 排在 $b 前面$a 排在 $b 後面<?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
$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),但回呼函數開銷較大array_multisort()SplFixedArray + 自定義快速排序str_contains() 等新函數做更複雜的語意排序掌握 usort() 搭配 strlen() 的組合技,能靈活解決各類字串長度排序需求。現代 PHP 版本請優先使用箭頭函數,代碼更簡潔、效能更佳。下次遇到「按關鍵字密度排序」、「依標題長度截斷」等需求,這招絕對派得上用場。