Сортировка массива объектов в PHP - PullRequest
0 голосов
/ 30 января 2010

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

Я думаю о чем-то вроде:

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

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

[Изменить] Просто чтобы уточнить, объекты, которые должны быть отсортированы (в массиве), имеют методы, которые возвращают либо строку (например, getName ()), либо числовое значение (например, getId ())

Типичный фрагмент кода использования будет выглядеть примерно так:

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

Ответы [ 2 ]

1 голос
/ 30 января 2010

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

1 голос
/ 30 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...