2016-11-20 5 views
2

저는 객체의 배열을 정렬하는 데 usort를 사용하고 있지만 실제로는 행의 원래 상대 순서를 어지럽히 지 않고 일종의 "그룹화"함수로 사용하기를 원합니다. 객체의 배열이 익명의 키를 사용하여 구성되어, 해당 데이터에서PHP는 객체의 값을 정렬하지만 원래의 상대적인 순서를 유지합니다.

MASTER_CODE, CONFIG_ITEM 
foo1, opt_ray 
foo2, opt_ray 
foo1, opt_fah 
foo2, opt_doe 

:

내가이이 말. 즉, 각 행은 객체로 파싱됩니다. 객체는 배열로 수집됩니다.

내가하고 싶은 일은 MASTER_CODE 값으로 배열을 정렬하는 것이지만 순서를 방해하지는 않습니다. 이다

는, 마지막 순서는해야한다 : 데이터가 외부 소스로부터 오기 때문에

MASTER_CODE, CONFIG_ITEM 
foo1, opt_ray 
foo1, opt_fah 
foo2, opt_ray 
foo2, opt_doe 

우리는 정렬 순서를 추가하지 마십시오.

마스터 코드로 정렬하기 위해 usort를 사용할 수는 있지만 원래의 상대적인 순서는 엉망입니다.

제안 사항?

+0

[PHP의 uasort으로 정렬 할 때 키 위해 (안정적 종류) 보존]의 사용 가능한 복제 (http://stackoverflow.com/questions/4353739/preserve-key-order-stable-sort이 같은 시도 -when-sorting-with-phps-uasort) – max

답변

0

이것은 하나의 옵션입니다. 가장 우아한 해결책은 아닙니다. 배열의 첫 번째 열 (필터링 할 문자열)에서 고유 값을 가져 와서 정렬 한 다음 루프를 반복하고 원래 배열의 항목을 동일한 첫 번째 값으로 추가합니다.

// Get an unique array of values to use for sorting 
$sorting = array_unique(array_column($a, 0)); 
sort($sorting); 

$sorted = []; 
foreach ($sorting as $sortValue) { 
    $sorted = array_merge(
     $sorted, 
     array_filter(
      $a, 
      function($row) use ($sortValue) { 
       // Find values that have the same first value as each sort value 
       return ($sortValue === $row[0]); 
      } 
     ) 
    ); 
} 

Example

참고 :이 PHP 5.5에서 작동합니다. PHP 5.3 태그가 붙어 있으므로 array_column 함수를 바꿔야 할 수도 있습니다.

$sorting = array_unique(array_map(function($row) { return $row[0]; }, $a)); 
+0

좋은 생각이지만, 배열의 배열이 아니라 객체의 배열이라는 것을 기억하는 것이 중요합니다. 데이터의 각 행이 개체로 구문 분석됩니다. 이러한 객체는 배열로 누적됩니다. – Tim

+0

예. 실제 객체의'var_export'를 게시하여 다른 모습을 볼 수 있습니까? –

+0

불행히도 민감한 데이터로 내보내기를 제공 할 수는 없습니다. – Tim