【问题标题】:php - usort or array_multisort?php - usort 还是 array_multisort?
【发布时间】:2010-06-10 11:37:40
【问题描述】:

尝试按 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 
        )
)

【问题讨论】:

    标签: php multidimensional-array


    【解决方案1】:

    由于这是关于 array_multisort 与 usort 最突出的 Google 结果,即使它已经 4 岁了,我也会回复。

    usort() 更简洁,不需要提取列数组来提供给 array_multisort()。 (它也比 array_multisort 少。)

    但是,当我今天在 20,000 和 10,000 个代表性数据行的数组上反复测试它时,usort() 在列时比 array_multisort() 慢 7-15 倍是 int 类型的随机值,并且该列是预先提取的。正如人们所期望的那样,因为对于每次比较,您都在将整个 php 函数调用与优化的内部代码进行比较。

    在上一个回复中使用匿名函数比传递定义函数的名称 usort() 提高了 30-35%。它永远不会比慢 8 倍好,而且通常比慢 10 倍还差。通常这无关紧要,但是当您开始占用十分之一秒的 CPU 时间来对一个数组进行排序时,它可能会发生。在 5.5 之前的服务器上提取没有 array_column() 的列,充其量只能将差异减半。

    【讨论】:

    • 我对多维数组进行了一些性能测试,比较了usort()array_multisort()Results 在 php 7.0 上支持后者。
    • 但是您是否还包括为多排序参数生成所需的临时数组所需的时间和内存?
    【解决方案2】:

    只要usort:

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

    array_multisort 用于同时比较来自不同数组(或子数组)的元素。您只想比较一个数组的元素,因此使用usort。这些元素本身就是数组这一事实无关紧要。

    【讨论】:

      【解决方案3】:

      作为记录(并与usort 解决方案进行比较), 这是array_multisort的使用方法:

      array_multisort(array_column($arr, 'memnum'), $arr);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-01
        相关资源
        最近更新 更多