按字母顺序对包含域和IDN域的数组进行排序

时间:2013-10-18 13:39:57

标签: php arrays sorting dns idn

所以我有一个包含域名的数组

Array () {
    [0] => Array () {
        [id]=>int
        [name]=>string
        [something]=>string/int...
    }
    [38] => Array () {

    }
}

我需要在表中显示域名,我从mysql表中按名称ASC排序,循环通过数组然后转换$ domain ['name']以显示IDN不像xn-- sfasdf-dfg.com,但人类可读。但是这个域名介于W和Y之间,因为它们以X开头,我想要的是通过它们的unicode名称някво-име.com(它以N开头)对它们进行排序这个域名应该在M和O之间,而不是在W和Y. 有人知道如何做到这一点?我在谷歌搜索过,但似乎没有人写过这样的问题。我尝试使用usort和uasort php函数,但顺序完全错误。

谢谢, Yani Krystev

2 个答案:

答案 0 :(得分:0)

排序(或技术术语的整理)是一个复杂的问题,已经在一种语言内部,但如果你混合语言则更是如此。没有与域名字符串相关联的上下文,您不知道它是哪种语言,您只需要一个包含字符的字符串(即使在仅使用ASCII的所有语言之间,排序顺序也不相同)。

因此,您首先需要对此进行排序并定义您想要使用的语言。 然后你有工具来进行整理,但它们不是基本的工具。

例如,在libc LC_COLLATE变量中,libicu变量将影响正确编程用于国际化的所有工具,从而将其考虑在内。

intl是处理此类事情的另一个大型图书馆,请参阅https://www-01.ibm.com/software/globalization/icu/

PHP有Collator扩展名,它是一个包装器。请参阅http://php.net/manual/en/class.collator.php上的recv(40)课程:

  

提供字符串比较功能,支持适当的区域设置敏感的排序顺序。

答案 1 :(得分:-1)

някво-име.com不以“N”开头,它以西里尔字母“AN”开头,其中听起来像英文“N”。如果你想根据字母声音的方式进行排序,你将会遇到困难。如果你想按字母排序,它是一个不同的alfabet,应该在Z之后或A之前。

我将所有域解码为unicode,将英文域转换为unicode,然后使用任何常规内置函数对unicode列表进行排序。