2010-01-30 7 views
0

일반적으로 객체 배열을 정렬하기 위해 클래스에 정적 메서드를 작성하려고합니다.PHP에서 객체 배열 정렬

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

전형적인 유스 케이스 코드는 그러므로 다음과 같이 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

그리고 실제 값을 얻기 위해 어떤 메소드를 호출해야 하는지를 sort 함수에 어떻게 설명합니까? – poke

+0

그게 전부입니다. 내가 원하는 것을 할 수 있도록 "해킹"할 수는 있지만 더 자연스럽고 우아한 솔루션이 있는지 알고 싶습니다 .- PHP는 내 " 네이티브 (native) "언어이므로 여기에 좀 더 우아하거나 PHP와 같은 접근법을 제안 할 수있는 사람들이 있다고 확신합니다. doSort() 메서드는 배열 요소 (객체)에서 호출 할 메서드의 이름을 사용합니다. 호출 된 메서드는 문자열이나 숫자를 반환하므로 필요한 비교 함수가 결정되면 간단히 approp로 usort를 호출하는 경우입니다. 콜백 (나는 내 ​​자신의 질문에 그냥 대답했다고 생각한다). –

1

usort을 사용하고 개체에 대한 비교 기능을 정의하십시오.