使用 usort 对数组进行排序

Posted

技术标签:

【中文标题】使用 usort 对数组进行排序【英文标题】:Sort array with usort 【发布时间】:2012-01-29 09:03:52 【问题描述】:

我有一个包含北、东、南或西值的数组。

例如,我得到一个数组,其中的值按以下顺序排列:南、西和北。

现在我想按照北、东、南和西的方式对数组进行排序。

所以在我的示例中,值应该按以下顺序排列:北、南、西。

我该怎么做?

谢谢!

【问题讨论】:

请添加一些您目前所做的代码。即使它只是数组的定义。也许您也可以更好地突出您遇到问题的地方。 comparison of array sorting functions 通常很有帮助。 能不能详细一点,为什么要这样排序?你想做什么?就像现在一样,我不明白你为什么不创建一个数组,并按照你想要的方式对其进行排序,因为你已经知道它需要包含什么。 您可以尝试为每个键赋予数值,其值为东北西南等。然后按数字键排序您是否使用 php @John Issaacks,我想你明白我的意思;-),但我需要对它进行排序,因为我会将它与另一个 (***.com/questions/8105244/how-to-use-an-array-in-case/…) 进行比较,所以如果我不对其进行排序,它无法比较。 【参考方案1】:

您也可以使用array_intersect()。它保留了第一个数组的顺序。将所有基本方向按正确顺序排列的数组作为第一个参数,将要排序的数组作为第二个参数。

$cardinals = array( 'north', 'east', 'south', 'west' );
$input = array( 'south', 'west', 'north' );

print_r( array_intersect( $cardinals, $input ) );

【讨论】:

有趣,我喜欢三件事(至少),简洁也很清楚,不使用任何回调并且可扩展(如果需要添加北-east 等)作为回调解决方案。整洁! 是的,非常整洁。如果需要按键排序,还有array_intersect_key【参考方案2】:

你可以按照这个思路做一些事情(我相信这也是 Samuel Lopez 在 cmets 中的建议):

$arr = array ('north', 'west', 'south', 'east', );

function compass_sort ($a, $b)

        $cmptable = array_flip (array (
                'north',
                /* you might want to add 'northeast' here*/
                'east',
                /* and 'southeast' here */
                'south',
                'west',
        ));

        $v1 = trim (mb_strtolower ($a));
        $v2 = trim (mb_strtolower ($b));

        if ( ! isset ($cmptable[$v1])
           || ! isset ($cmptable[$v2]))
        
                /* error, no such direction */
        

        return $cmptable[$v1] > $cmptable[$v2];


usort ($arr, 'compass_sort');

这会为每个方向分配一个数字并按该数字排序,north 将分配为零,east 将分配一个(除非您在两者之间添加一些东西)等等。

【讨论】:

以上是关于使用 usort 对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP usort() 通过用户自定义的比较函数对数组进行排序

usort 对多个字段进行排序

usort() 自定义排序

PHP多维数组的排序问题

PHP中如何对二维数组按某个键值进行排序

二维数组重新排序