PHP Conference Japan 2024

natcasesort

(PHP 4, PHP 5, PHP 7, PHP 8)

natcasesort使用不區分大小寫的「自然排序」演算法排序陣列

說明

natcasesort(陣列 &$array): true

natcasesort()natsort() 的不區分大小寫版本。

此函式實作了一個排序演算法,它以人類的方式排序字母數字字串,同時維護鍵/值關聯。這被描述為「自然排序」。

注意事項:

如果兩個成員比較相等,它們會保留其原始順序。在 PHP 8.0.0 之前,它們在已排序陣列中的相對順序未定義。

注意事項:

將陣列的內部指標重設為第一個元素。

參數

array

輸入的陣列。

回傳值

永遠回傳 true

更新日誌

版本 說明
8.2.0 現在的回傳值類型為 true;先前是 bool 類型。

範例

範例 #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 的 » 自然排序字串比較 頁面。

參見

新增註解

使用者貢獻的註解 5 則註解

dslicer at maine dot rr dot com
21 年前
應該記錄的一點是,natsort 和 natcasesort 都會保留陣列的鍵值關聯。如果您對使用數字索引的陣列執行 natsort,則 for 迴圈將不會產生排序後的順序;然而,foreach 迴圈會產生排序後的順序,但索引不會按數字順序排列。如果您希望 natsort 和 natcasesort 打破鍵值關聯,只需在排序後的陣列上使用 array_values,如下所示:

natcasesort($arr);
$arr = array_values($arr);
w-dot-rosenbach-at-netskill-de
13 年前
以任意順序排序 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>';
?>
claude at schlesser dot lu
15 年前
這裡有一個函式,它將使用包含特殊字元的鍵,按鍵值對陣列進行自然排序。

<?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;
}
?>

希望這對某些人有用 :)
vbAlexDOSMan at Yahoo dot com
21 年前
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));
}
}
tmiller25 at hotmail dot com
22 年前
如果您希望首字元相同的項目以較短字串優先的方式排列,請將此迴圈添加到上述函式中。
--------------------
/* 短的在長的前方 (例如 '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;
}
}
--------------------
To Top