2010-06-10 23 views
5

Diziyi aşağıdakine göre aşağıdakine göre sıralamaya çalışıyorum ve kullanmam daha iyi olan şaşkınım ... usort veya array_multisort? Çok boyutlu olduğu için usort düşünüyordum? Bunun bir örneği var mı?php - usort veya 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 
     ) 
) 

cevap

9

sadece usort:

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

array_multisort

aynı anda farklı diziler (veya alt-dizileri) elemanları karşılaştırmak için kullanılır. Yalnızca bir dizinin öğelerini karşılaştırmak isterseniz, usort kullanın. Bu unsurların kendileri dizileri olması, konuyla ilgisizdir.

13

Bu, array_multisort vs usort üzerindeki en önemli Google sonucu olduğundan, 4 yaşında olsa bile yanıtlayacağım.

usort() daha kısa olduğu ve array_multisort beslemek için bir sütun dizisi ekstre gerektirmez(). (Aynı zamanda, array_multisort daha az yapar.)

Ancak, tekrar tekrar 20.000 ve 10.000 temsili veri sıralar halinde ilgili bugün test edildiğinde, usort()() zaman kolon array_multisort daha 7-15x yavaş Rastgele değerler int cinsindendir ve sütun önceden ekstrakte edilmiştir. Her karşılaştırma için tüm bir php işlevi çağrısını optimize edilmiş iç kodla karşılaştırdığınızdan, bu beklenebilir.

Önceki yanıttaki gibi anonim bir işlev kullanmak, kullanım numaralı() işlevini tanımlanmış bir işlevin geçilmesiyle% 30-35 iyileşme sağladı. 8x daha yavaş ve genellikle 10x daha yavaş daha kötü değildi. Bu çoğu zaman önemli değil, ama sadece bir diziyi sıralamak için bir saniye CPU süresinin onda birine girmeye başladığınızda olabilir. Bir 5.5 öncesi sunucuda array_column() olmadan sütunu ayıklamak, hiç ayırma işlemini en iyi şekilde yarıya düşürmedi.

+0

"usort() ve" array_multisort() "işlevlerini karşılaştırarak çok boyutlu dizilerde birkaç performans testi yaptım. [Sonuçlar] (https://www.codepunker.com/blog/3-solutions-for-multidimensional-array-sorting-by-child-keys-or-values-in-PHP#performance-test) lehine ikincisi php 7.0'da. –