PHP - usort还是array_multisort?

5

我想按照memnum的升序对下面的数组进行排序,但我有点困惑应该使用哪个函数……是usort还是array_multisort?我认为应该使用usort,因为它是多维的?有没有人有这方面的例子呢?

Array
(
    [0] => Array
        (
            [memnum] => 3236467423
            [mid] => 1104881300  
            [fname] => JOHN        
            [lname] => DOE                 
            [add1] =>  OMITTED
            [add2] =>             
            [city] => CHESTERFIELD      
            [state] => MI
            [zip] => 48051
            [age] => 50 
        )
    [1] => Array
        (
            [memnum] => 3258467922
            [mid] => 1105121457  
            [fname] => JANE        
            [lname] => DOE                 
            [add1] =>  OMITTED
            [add2] =>             
            [city] => CHESTERFIELD      
            [state] => MI
            [zip] => 48051
            [age] => 50 
        )
    [2] => Array
        (
            [memnum] => 3237769108
            [mid] => 1104489312  
            [fname] => BOB        
            [lname] => DOE                 
            [add1] =>  OMITTED
            [add2] =>             
            [city] => CHESTERFIELD      
            [state] => MI
            [zip] => 48051
            [age] => 50 
        )
)
3个回答

15

既然这是关于array_multisort和usort最突出的谷歌搜索结果,即使它已经四年了,我也要回复一下。

usort() 更简洁,不需要提取列数组来输入到array_multisort()。(它执行的操作也比array_multisort少。)

但是,当我今天反复测试代表性数据行数为20,000和10,000的数组时,如果列是int类型的随机值并且预先提取了该列,usort()比array_multisort()慢7-15倍。这是可以预料到的,因为对于每个比较,你都在将整个php函数调用与优化的内在代码进行比较。

像先前回复中所描述的那样使用匿名函数,可以比将usort()传递给定义函数的名称提高30-35%,但它从未比8倍慢,通常比10倍慢更糟。通常不会有影响,但当你开始在排序一个数组上花费几分之一秒的CPU时间时,则可能会产生影响。在没有array_column()的pre-5.5服务器上提取列最多只能将差异减半。


我对多维数组运行了一些性能测试,比较了 usort()array_multisort()结果表明,在php 7.0上,后者更为优秀。 - The CodePunker
但是你是否还包括了生成多重排序参数所需的临时数组所需的时间和内存? - Mike Doe

10

就是用 usort 就行了:

usort($arr, function (array $a, array $b) { return $a["memnum"] - $b["memnum"]; });

array_multisort 用于同时比较来自不同数组(或子数组)的元素。你只想比较一个数组的元素,所以你可以使用 usort。这些元素本身是数组是无关紧要的。


0
记录一下(与usort解决方案进行比较),以下是如何使用array_multisort
array_multisort(array_column($arr, 'memnum'), $arr);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接