2010-09-16 4 views
0

usort и uasort использовать функцию сравнения, которая медленна, потому что она должна вычисляться каждый раз, когда требуется сравнение между элементами массива. Другие языки, такие как Python, позволяют сортировать массив с помощью ключевой функции, которая оценивается только один раз для каждого элемента массива. Каков наилучший способ сделать это в PHP?Лучший способ сортировки массива в PHP с использованием ключевой функции?

+1

Этот парень также [блог об этом вопросе на своем сайте] (http://www.nathanieltroutman.net/content/sorting-arrays-php-using-key-function). Он имеет гораздо больше деталей и результатов тестов. – shamittomar

ответ

-3
 
function sort_with_keyfunc($array, $keyfunc) { 
    $keys = array_map($keyfunc, $array); // get the keys for each item 
    array_multisort($keys, $array); // sort $array according to the sorted keys 
    return $array; 
} 

Это также поддерживает пары ключей => в ассоциативных массивах.

+3

Uh whaaaaat? Вы сразу отвечаете на свои вопросы - менее чем за две минуты? – Rudu

+0

Его хороший быстрый способ получить эти значки :) –

+0

Этот парень также [блог об этом вопросе на своем сайте] (http://www.nathanieltroutman.net/content/sorting-arrays-php-using-key-function). Он имеет гораздо больше деталей и результатов тестов. – shamittomar

0

Вам нужно быстрее? Используйте Quicksort:

<?php 
function quicksort($arr, $l = 0 , $r = NULL) { 
// when the call is recursive we need to change 
// the array passed to the function earlier 
    static $list = array(); 
    if($r == NULL) 
     $list = $arr; 

    if($r == NULL) 
     $r = count($list)-1;//last element of the array 

    $i = $l; 
    $j = $r; 

    $tmp = $list[(int)(($l+$r)/2)]; 

    // partion the array in two parts. 
    // left from $tmp are with smaller values, 
    // right from $tmp are with bigger ones 
    do { 
     while($list[$i] < $tmp) 
      $i++; 

     while($tmp < $list[$j]) 
      $j--; 

     // swap elements from the two sides 
     if($i <= $j) { 
      $w = $list[$i]; 
      $list[$i] = $list[$j]; 
      $list[$j] = $w; 

      $i++; 
      $j--; 
     } 
    }while($i <= $j); 

    // devide left side if it is longer the 1 element 
    if($l < $j) 
     quicksort(NULL, $l, $j); 

    // the same with the right side 
    if($i < $r) 
     quicksort(NULL, $i, $r); 

    // when all partitions have one element 
    // the array is sorted 

    return $list; 
} 
?> 
+1

ee gads man, используя короткие теги, подобные этому !!! EEEK !! (примечание стороны, теперь я чувствую себя нарушенным) –

+2

-1 [PHP 'sort' function] (http://php.net/sort) уже использует Quicksort:« Как и большинство функций сортировки PHP, 'sort()' использует реализацию из Quicksort. " – Gumbo

+0

@Gumbo: Хорошая точка. Я этого никогда не замечал. :) – shamittomar

Смежные вопросы