應該記錄的一點是,natsort 和 natcasesort 都會保留陣列的鍵值關聯。如果您對使用數字索引的陣列執行 natsort,則 for 迴圈將不會產生排序後的順序;然而,foreach 迴圈會產生排序後的順序,但索引不會按數字順序排列。如果您希望 natsort 和 natcasesort 打破鍵值關聯,只需在排序後的陣列上使用 array_values,如下所示:
natcasesort($arr);
$arr = array_values($arr);
(PHP 4, PHP 5, PHP 7, PHP 8)
natcasesort — 使用不區分大小寫的「自然排序」演算法排序陣列
natcasesort() 是 natsort() 的不區分大小寫版本。
此函式實作了一個排序演算法,它以人類的方式排序字母數字字串,同時維護鍵/值關聯。這被描述為「自然排序」。
注意事項:
如果兩個成員比較相等,它們會保留其原始順序。在 PHP 8.0.0 之前,它們在已排序陣列中的相對順序未定義。
注意事項:
將陣列的內部指標重設為第一個元素。
array
輸入的陣列。
永遠回傳 true
。
範例 #1 natcasesort() 範例
<?php
$array1 = $array2 = array('IMG0.png', 'img12.png', 'img10.png', 'img2.png', 'img1.png', 'IMG3.png');
sort($array1);
echo "標準排序\n";
print_r($array1);
natcasesort($array2);
echo "\n自然排序(不區分大小寫)\n";
print_r($array2);
?>
上述範例將輸出:
Standard sorting Array ( [0] => IMG0.png [1] => IMG3.png [2] => img1.png [3] => img10.png [4] => img12.png [5] => img2.png ) Natural order sorting (case-insensitive) Array ( [0] => IMG0.png [4] => img1.png [3] => img2.png [5] => IMG3.png [2] => img10.png [1] => img12.png )
更多資訊請參考:Martin Pool 的 » 自然排序字串比較 頁面。
應該記錄的一點是,natsort 和 natcasesort 都會保留陣列的鍵值關聯。如果您對使用數字索引的陣列執行 natsort,則 for 迴圈將不會產生排序後的順序;然而,foreach 迴圈會產生排序後的順序,但索引不會按數字順序排列。如果您希望 natsort 和 natcasesort 打破鍵值關聯,只需在排序後的陣列上使用 array_values,如下所示:
natcasesort($arr);
$arr = array_values($arr);
以任意順序排序 UTF-8
<?php
mb_internal_encoding("UTF-8");
class utf_8_german
{
// everything else is sorted at the end
static $order = '0123456789AaÄäBbCcDdEeFfGgHhIiJjKkLlMm
NnOoÖöPpQqRrSsßTtUuÜüVvWwXxYyZz';
static $char2order;
static function cmp($a, $b) {
if ($a == $b) {
return 0;
}
// lazy init mapping
if (empty(self::$char2order))
{
$order = 1;
$len = mb_strlen(self::$order);
for ($order=0; $order<$len; ++$order)
{
self::$char2order[mb_substr(self::$order, $order, 1)] = $order;
}
}
$len_a = mb_strlen($a);
$len_b = mb_strlen($b);
$max=min($len_a, $len_b);
for($i=0; $i<$max; ++$i)
{
$char_a= mb_substr($a, $i, 1);
$char_b= mb_substr($b, $i, 1);
if ($char_a == $char_b) continue;
$order_a = (isset(self::$char2order[$char_a])) ? self::$char2order[$char_a] : 9999;
$order_b = (isset(self::$char2order[$char_b])) ? self::$char2order[$char_b] : 9999;
return ($order_a < $order_b) ? -1 : 1;
}
return ($len_a < $len_b) ? -1 : 1;
}
}
// usage example:
$t = array(
'Birnen', 'Birne', 'Äpfel', 'Apfel',
);
uasort($t, 'utf_8_german::cmp');
echo '$t: <pre>'.htmlspecialchars(print_r($t,true),null,'UTF-8').'</pre>';
?>
這裡有一個函式,它將使用包含特殊字元的鍵,按鍵值對陣列進行自然排序。
<?php
函式 natksort($array)
{
$original_keys_arr = array();
$original_values_arr = array();
$clean_keys_arr = array();
$i = 0;
foreach ($array as $key => $value)
{
$original_keys_arr[$i] = $key;
$original_values_arr[$i] = $value;
$clean_keys_arr[$i] = strtr($key, "ÄÖÜäöüÉÈÀËëéèàç", "AOUaouEEAEeeeac");
$i++;
}
natcasesort($clean_keys_arr);
$result_arr = array();
foreach ($clean_keys_arr as $key => $value)
{
$original_key = $original_keys_arr[$key];
$original_value = $original_values_arr[$key];
$result_arr[$original_key] = $original_value;
}
return $result_arr;
}
?>
希望這對某些人有用 :)
Ulli at Stemmeler dot net:我重寫了你的函式 -- 現在更精簡了 -- 享受使用吧...
函式 ignorecasesort(&$array) {
/*將每個元素變成它的小寫加上它本身*/
/*(例如 "MyWebSite" 會變成 "mywebsiteMyWebSite"*/
for ($i = 0; $i < sizeof($array); $array[$i] = strtolower($array[$i]).$array[$i], $i++);
/*排序 -- 只會使用小寫版本*/
sort($array);
/*取每個陣列元素,將其切成兩半,並將後半部分添加到新的陣列中*/
/*(例如 "mywebsiteMyWebSite" 會變成 "MyWebSite")*/
for ($i = 0; $i < sizeof($array); $i++) {
$this = $array[$i];
$array[$i] = substr($this, (strlen($this)/2), strlen($this));
}
}
如果您希望首字元相同的項目以較短字串優先的方式排列,請將此迴圈添加到上述函式中。
--------------------
/* 短的在長的前方 (例如 'abc' 應該在 'abcd' 之前) */
for($i=count($array)-1;$i>0;$i--) {
$str_a = $array[$i ];
$str_b = $array[$i-1];
$cmp_a = strtolower(substr($str_a,0,strlen($str_a)));
$cmp_b = strtolower(substr($str_b,0,strlen($str_a)));
if ($cmp_a==$cmp_b && strlen($str_a)<strlen($str_b)) {
$array[$i]=$str_b; $array[$i-1]=$str_a; $i+=2;
}
}
--------------------