如何在PHP数组排序中使用多个sort_flags(使用SORT_LOCALE_STRING,SORT_NATURAL)?
How to use multiple sort_flags in PHP array sorting (Using SORT_LOCALE_STRING , SORT_NATURAL)?
如何在PHP数组排序中使用多个sort_flags(使用SORT_LOCALE_STRING,SORT_NATURAL)?
我想将 SORT_LOCALE_STRING 用于 UTF8 语言 + SORT_NATURAL 数字。
我想对以下数组进行排序:
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
排序后我最喜欢的结果:
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[3] => Älpha3
[4] => Älpha4
[5] => Älpha10
[6] => Bravo
)
但是当使用SORT_LOCALE_STRING时:
<?php
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
setlocale(LC_COLLATE, 'de_DE.UTF8', 'de.UTF8', 'de_DE.UTF-8', 'de.UTF-8');
sort($array, SORT_LOCALE_STRING);
print_r($array);
?>
结果:
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha10
[3] => Älpha2
[4] => Älpha3
[5] => Älpha4
[6] => Bravo
)
AND 在使用 SORT_NATURAL 时:
<?php
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
sort($array, SORT_NATURAL);
print_r($array);
?>
结果:
Array
(
[0] => Alpha
[1] => Bravo
[2] => Älpha1
[3] => Älpha2
[4] => Älpha3
[5] => Älpha4
[6] => Älpha10
)
我怎样才能得到这样的结果?!
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[3] => Älpha3
[4] => Älpha4
[5] => Älpha10
[6] => Bravo
)
更新:
我终于找到了解决方案,通过使用 intl AND The Collator class。
首先,启用PHP国际扩展
然后:
<?php
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
$collator = new Collator('de_DE.UTF8');
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$collator->setAttribute(Collator::CASE_FIRST, Collator::LOWER_FIRST);
$collator->asort($array);
print_r($array);
?>
结果:
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[4] => Älpha3
[5] => Älpha4
[3] => Älpha10
[6] => Bravo
)
问题是您要使用的两个标志几乎相互矛盾。
SORT_NATURAL 想要将值视为字符串和数字的混合,而 SORT_LOCALE_STRING 想要将其纯粹视为字符串。
不确定是否有更简单的方法,但此代码将所有字母转换为标准字母表(使用 iconv()
),对该数组进行排序(使用 asort
保留键和 SORT_NATURAL
) 然后替换回原始字符串(使用 array_replace()
)...
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
setlocale(LC_ALL, "en_US.utf8");
$trans = $array;
array_walk($trans, function (&$data) {
$data = iconv("UTF-8", 'ASCII//TRANSLIT//IGNORE', $data);
});
asort($trans, SORT_NATURAL);
$array = array_replace($trans, $array);
print_r($array);
给...
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[4] => Älpha3
[5] => Älpha4
[3] => Älpha10
[6] => Bravo
)
首先,启用PHP 国际扩展
然后:
<?php
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
$collator = new Collator('de_DE.UTF8');
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$collator->setAttribute(Collator::CASE_FIRST, Collator::LOWER_FIRST);
$collator->asort($array);
print_r($array);
?>
结果:
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[4] => Älpha3
[5] => Älpha4
[3] => Älpha10
[6] => Bravo
)
如何在PHP数组排序中使用多个sort_flags(使用SORT_LOCALE_STRING,SORT_NATURAL)?
我想将 SORT_LOCALE_STRING 用于 UTF8 语言 + SORT_NATURAL 数字。
我想对以下数组进行排序:
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
排序后我最喜欢的结果:
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[3] => Älpha3
[4] => Älpha4
[5] => Älpha10
[6] => Bravo
)
但是当使用SORT_LOCALE_STRING时:
<?php
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
setlocale(LC_COLLATE, 'de_DE.UTF8', 'de.UTF8', 'de_DE.UTF-8', 'de.UTF-8');
sort($array, SORT_LOCALE_STRING);
print_r($array);
?>
结果:
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha10
[3] => Älpha2
[4] => Älpha3
[5] => Älpha4
[6] => Bravo
)
AND 在使用 SORT_NATURAL 时:
<?php
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
sort($array, SORT_NATURAL);
print_r($array);
?>
结果:
Array
(
[0] => Alpha
[1] => Bravo
[2] => Älpha1
[3] => Älpha2
[4] => Älpha3
[5] => Älpha4
[6] => Älpha10
)
我怎样才能得到这样的结果?!
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[3] => Älpha3
[4] => Älpha4
[5] => Älpha10
[6] => Bravo
)
更新:
我终于找到了解决方案,通过使用 intl AND The Collator class。
首先,启用PHP国际扩展
然后:
<?php
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
$collator = new Collator('de_DE.UTF8');
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$collator->setAttribute(Collator::CASE_FIRST, Collator::LOWER_FIRST);
$collator->asort($array);
print_r($array);
?>
结果:
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[4] => Älpha3
[5] => Älpha4
[3] => Älpha10
[6] => Bravo
)
问题是您要使用的两个标志几乎相互矛盾。 SORT_NATURAL 想要将值视为字符串和数字的混合,而 SORT_LOCALE_STRING 想要将其纯粹视为字符串。
不确定是否有更简单的方法,但此代码将所有字母转换为标准字母表(使用 iconv()
),对该数组进行排序(使用 asort
保留键和 SORT_NATURAL
) 然后替换回原始字符串(使用 array_replace()
)...
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
setlocale(LC_ALL, "en_US.utf8");
$trans = $array;
array_walk($trans, function (&$data) {
$data = iconv("UTF-8", 'ASCII//TRANSLIT//IGNORE', $data);
});
asort($trans, SORT_NATURAL);
$array = array_replace($trans, $array);
print_r($array);
给...
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[4] => Älpha3
[5] => Älpha4
[3] => Älpha10
[6] => Bravo
)
首先,启用PHP 国际扩展
然后:
<?php
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
$collator = new Collator('de_DE.UTF8');
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$collator->setAttribute(Collator::CASE_FIRST, Collator::LOWER_FIRST);
$collator->asort($array);
print_r($array);
?>
结果:
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[4] => Älpha3
[5] => Älpha4
[3] => Älpha10
[6] => Bravo
)