2010-10-11 3 views
3

Я ищу для быстрой сортировки некоторых объектов в php.Как быстро сортировать по нескольким столбцам

Я сортировки массива ОБЪЕКТОВ

$object->x; 
$object->y; 
$object->z; 

Я хочу сначала сортировать по х, то у, то г.

Это моя быстрая сортировка функция Где она принимает массив jobjects, и сортирует по определенной SortKey (х, у, или г колонка) Функция возвращает отсортированный массив объектов, которые были отсортированный по SortKey ,

private function quicksort($objects, $sortKey) { 
    if(count($objects) < 2) return $objects; 

    $left = $right = array(); 

    reset($objects); 
    $pivot_key = key($objects); 
    $pivot = array_shift($objects); 

    foreach($objects as $k => $v) { 
     if($v->$sortKey < $pivot->$sortKey) 
      $left[$k] = $v; 
     else 
      $right[$k] = $v; 
    } 

    return array_merge($this->quicksort($left,$sortKey), array($pivot_key => $pivot), $this->quicksort($right,$sortKey)); 
} 

Я могу легко быстрая сортировку любого отдельный столбец, используя QuickSort рекурсивного алгоритма, но сгруппировать их вместе, а затем сортировку этих подгрупп до энного времени действительно баловаться с моей головой.

Есть ли алгоритм, на который я могу смотреть?

ответ

7

Вам нужен другой подход, чем ваша первоначальная мысль. Вместо сортировки рекурсивно, сделайте только один, который принимает все ваши критерии в виду сразу, в ранжированном порядке (т. Е. Если x одинаково, проверьте y и т. Д.).

Другие уже указали на функции сортировки, которые в качестве аргумента принимают функцию сравнения . Функция сравнения дается два из ваших объектов и возвращает, какой объект меньше/больше другого.

В коде вы в курсе, у вас есть такое сравнение:

if($v->$sortKey < $pivot->$sortKey) 

Вместо тест $ V -> $ SortKey < $ поворота -> $ SortKey, вам нужно позвонить в вашей собственной функции сравнения, например

if (smaller($v, $pivot)) 

В функции smaller(), вы определяете правила.

private function smaller($obj1, $obj2) { 
    if ($obj1->x < $obj2->x) 
     return true; 
    if ($obj1->x > $obj2->x) 
     return false; 
    if ($obj1->y < $obj2->y) 
     return true; 
    if ($obj1->y > $obj2->y) 
     return false; 
} 

... и так далее. Как вы можете видеть, сортировка будет обеспечивать упорядочение в соответствии с x, а в случае, когда x одинаково (не меньше, а не больше), продолжают упорядочиваться в соответствии с y.

2

Вы реализуете свой собственный вид? Вы проверили http://us3.php.net/usort?

Функция usort() может принимать функцию сравнения, поэтому вы можете реализовать практически любые правила заказа, которые вы хотите.

1

Алгоритмы сортировки не зависят от механики сравнения, а только от того, что он возвращает последовательный порядок. Вам нужна процедура сортировки, которая позволяет вам указать свою собственную функцию сравнения.

Php предоставляет три: usort(), uasort() и uksort().

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