2010-01-30 7 views
0

Я хочу написать статический метод в классе для общего сортирования массива объектов.Сортировка массива объектов в PHP

Я имею в виду Somthing вдоль линий:

class GenUtils { 
    const ASCENDING = 1; 
    const DESCENDING = 2; 

    protected static alphaSort($value1, $value2, $sort_type=self::DESCENDING){ 
    $retval = strcasecmp($value1, $value2); 
    return ($sort_type == self::DESCENDING) ? $retval : (-1*$retval); 
    } 

    protected static numericSort($value1, $value2, $sort_type=self::DESCENDING){ 
    return $value1 < $value2; 
    } 

    // Assumption: array is non-empty and homogeneous 
    public doSort(array& $object_array, $method_name, $sort_type=self::DESCENDING) { 
     if(!empty($object_array) && method_exists($object_array[0],$method_name)) { 
      $element = $object_array[0]; 
      $value = $element->$method_name(); 
      if(is_string($value)){ 
      //do string sort (possibly using usort) 
      } 
      elseif(is_number($value)){ 
      //do numeric sort (possibly using usort) 
      } 
     } 
    } 
} 

Это просто быстрый дамп мозга -perharps кто-то может заполнить недостающие части, или предложить лучший способ сделать это?

[Редактировать] Просто для уточнения, объекты для сортировки (в массиве), есть методы, которые возвращают либо строку (например, GetName()) или числовое значение (например, GetId())

поэтому

типичный UseCase фрагмент кода будет somethimng так:

GenUtils::doSort($objects,'getName'); // This will do an alphabetic DESC sort using the getName() method 

GenUtils::doSort($objects, 'getId', GenUtils::ASCENDING); // This will do a numeric ASC sort using the getId() method 
+0

Почему бы не использовать 'natcasesort()' вместо этого? –

ответ

1

случаи использования (цифровая и строка) в вашем примере уже встроены в PHP - Проверьте функцию sort. Я бы использовал встроенную функцию, если у меня не было более конкретных потребностей.

+0

И как вы скажете функцию сортировки, какой метод ей нужно вызвать, чтобы получить фактическое значение? – poke

+0

Это отчасти то, что я прошу ... Я могу «взломать» его, чтобы заставить его делать то, что я хочу, но я хочу знать, есть ли более естественное или изящное решение для него - после этого PHP не мой " родной "язык, поэтому я уверен, что есть некоторые из них, которые могут предложить более элегантный или похожий на PHP подход. Метод doSort() принимает имя метода, который будет вызываться в элементе массива (объекты). Вызываемый метод возвращает либо строку, либо число (на данный момент), поэтому, как только будет определена требуемая функция сравнения, это просто случай вызова usort с помощью соответствующего. callback (я думаю, что я просто ответил на свой вопрос!) –

1

Используйте usort и определите свою собственную функцию сравнения для работы с вашими объектами.

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