2010-06-10 19 views
5

Tratando de ordenar la matriz de abajo por memnum en orden ascendente, y estoy un poco confundido, que es mejor usar ... usort o array_multisort? Estaba pensando en la orden porque es multidimensional. ¿Alguien tiene un ejemplo de esto?php - usort o array_multisort?

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 
     ) 
) 

Respuesta

9

Sólo usort:

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

array_multisort se usa para comparar elementos de diferentes matrices (o sub-series) al mismo tiempo. Desea comparar elementos de una sola matriz, por lo que usa usort. El hecho de que esos elementos sean en sí mismos arrays es irrelevante.

13

Dado que este es el resultado más destacado de Google en array_multisort vs usort, responderé aunque tenga 4 años.

usort() es más concisa y no requiere la extracción de una matriz columna para alimentar a array_multisort(). (También hace menos de array_multisort.)

Sin embargo, cuando repetidamente probado hoy en matrices de 20.000 y 10.000 filas de datos representativos, usort() era 7-15x más lento que array_multisort() cuando la columna fueron valores aleatorios de tipo int y la columna fue preextraída. Eso es lo que uno podría esperar, ya que para cada comparación está comparando una llamada completa a la función php con un código intrínseco optimizado.

El uso de una función anónima como en la respuesta anterior dio una mejora del 30-35% al ​​pasar usort() el nombre de una función definida. Nunca fue mejor que 8 veces más lento y usualmente peor que 10 veces más lento. A menudo, esto no importará, pero cuando comiences a obtener el décimo de segundo de CPU solo para ordenar una matriz, podría hacerlo. Al extraer la columna sin array_column() en un servidor pre-5.5, nunca se ha reducido a la mitad el diferencial en el mejor de los casos.

+0

Realicé algunas pruebas de rendimiento en matrices multidimensionales que comparaban 'usort()' y 'array_multisort()'. [Resultados] (https://www.codepunker.com/blog/3-solutions-for-multidimensional-array-sorting-by-child-keys-or-values-in-PHP#performance-test) están a favor de el último en php 7.0. –