我正在尝试按以下方式对数组类型的变量进行字母排序:
代码
$palabras = array(
'así',
'alfabeto',
'alfabético',
'año',
);
sort($palabras);
var_export($palabras);
结果
array (
0 => 'alfabeto',
1 => 'alfabético',
2 => 'así',
3 => 'año',
)
但是正如您所看到的,它不能与重音符号和“ñ”一起正常工作,应该像重音符号不存在一样进行排序,并且使用"n" < "ñ" < "o"
.
如何在不使用外部库的情况下按字母顺序对它们进行排序?
如果您的服务器支持西班牙语(肯定是):
您将获得按字母顺序排列单词的输出:
在此处查看此示例!
要执行正确的字母排序,您需要一个多级排序算法。根据您的 PHP 安装,您可能有权访问ICU库的UCA(Unicode 排序算法)实现。如果没有,您将需要安装.
php-intl
您将需要一个
Collator
配置为西班牙语 ("es"
)。该算法所做的是在概念上将比较分为几个级别,具有不同的偏好。因此,基本字母的差异比重音的差异更重要,重音的差异比大写和小写字母的差异更重要,......该对象是完全可配置的,您可以在PHP 文档
Collator
中查看它。您只需要使用该类
Collator
:您需要执行以下操作:
该列表通过引用传递,其顺序如下:
请注意,该类是国际化函数
Collator
扩展的一部分,该扩展内置于 PHP 5.3 及更高版本中。如果您使用的是旧版本的 PHP,则需要手动安装此扩展。无论如何,如果你想让代码尽可能地可移植,你总是可以使用 function 检查类是否存在
class_exists()
,如果不存在,使用另一种更基本的算法。这是我最终使用的解决方案
基于:
代码
collator_create()
它们setlocale()
应该在函数之外并运行 1 次。他们在那里简化示例。结果
demo en ideone