php>=5.4 的版本中,ksort函數多了兩個 SORT_NATURAL 和 SORT_FLAG_CASE 這兩個 sort_flags[1]。
如果這樣的函數
ksort($arr, SORT_NATURAL | SORT_FLAG_CASE);
用在php<5.4 環境中,就會出現這樣的錯誤:
PHP Notice: Use of undefined constant SORT_NATURAL - assumed 'SORT_NATURAL' in ..
PHP Notice: Use of undefined constant SORT_FLAG_CASE - assumed 'SORT_FLAG_CASE' in ..
把系統的php升級到5.4以上並不是最好的解決方法,因為解決這個問題,可能會導致更多的問題出現。
php<5.4有兩個原生的函數 natsort和 natcasesort 不能解決這個問題,因為ksort是以key值排序,這兩個是以值排序。所以必要有更有效的方法,後來找到高手John Resig及 Timo Tijhof寫出的解決方法[2]:
/**
* PHP has natsort() but no natksort().
*
* @source http://stackoverflow.com/a/1186347/319266
* @seealso php.net/uksort, php.net/natsort, php.net/strnatcmp
*/
function natksort( &$array ) {
uksort( $array, 'strnatcmp' );
}
/**
* PHP has natcasesort() but no natcaseksort().
*
* @source http://stackoverflow.com/a/1186347/319266
* @seealso php.net/uksort, php.net/natcasesort, php.net/strnatcasecmp
*/
function natcaseksort( &$array ) {
uksort( $array, 'strnatcasecmp' );
}
測試無誤,好用簡潔。用法:
natksort($arr); // =ksort($arr, SORT_NATURAL);
natcaseksort($arr); // =ksort($arr, SORT_NATURAL | SORT_FLAG_CASE);
延伸閱讀
[PHP] 陣列排序 sort, ksort, asort, usort...@新精讚
參考資料
[1] PHP function "sort" manual
[2] http://cordyshtml5.googlecode.com/svn-history/r248/branches/buildsdk/testswarm/inc/utilities.php