2009-03-30 4 views
2

나는 데이터베이스 (~ 1500 행, 각각 10-15 개의 필드)에서 가져온 데이터의 largish 테이블을 가지고 있으며, 많은 필터를 수행하고 통계를 생성하고이를 사용자가 다운로드 할 수있는 Excel 스프레드 시트에 저장하고 있습니다. .동일한 배열에서 array_multisort를 여러 번 사용 하시겠습니까?

간단한 수정 (WHERE 및 ORDER BY에 대한)만으로도 동일한 복잡한 쿼리로 데이터베이스를 반복적으로 방문하지 않고 결과를 하나의 큰 배열로 저장하고 DB로 한 번만 이동합니다. 그런 다음 array_filterarray_multisort을 사용하여 새로운 데이터 뷰를 얻습니다.

나는 array_multisort을 처음 사용하므로 여기 비평을 위해 작성한 내용을 게시 할 예정입니다.

// an numerical array of associative arrays 
$records = $dbResult->convertToArray(); 

$fields = $dbResult->getFieldNames(); 

// this is run once at the start 
$sortArr = array(); 
foreach ($fields as $field) $sortArr[$field] = array(); 

foreach ($records as $r) { 
    foreach ($r as $key => $value) { 
     $sortArr[$key][] = $value; 
    } 
} 

// and then to sort: 
array_multisort(
    $sortArr['Date Completed'], SORT_DESC, 
    $sortArr['Last Name'], SORT_ASC, 
    $sortArr['First Name'], SORT_ASC, 
    $sortArr['Course'], SORT_ASC, 
    $records 
); 

처음에는 "전체 결과를 다른 배열로 복사"해도 이상하지 않습니다. 목록을 다시 정렬해야 할 때 문제가 발생합니다. 내 $sortArr$records 배열과 동기화 상태를 유지해야하지만 각 정렬 후에는 깨지는 느낌이 들었습니다.

이것이 의도 된 용도 인 것인지는 모르겠다. array_multisort이므로 여기를 참고하십시오. 누군가 조언이나 조언을 해줄 수 있습니까? 어떻게 다차원 배열을 정렬 할 수 있습니까?

답변

1

다음은 내가 함께 일을 끝내 었습니다. 이것은 PHP 매뉴얼의 usort 페이지에있는 주석에서 martin이 게시 한 함수의 약간 수정 된 버전입니다.

function arfsort(&$array, $fieldList){ 
    if (!is_array($fieldList)) { 
     $fieldList = array(array($fieldList, SORT_ASC)); 
    } else { 
     for ($i = 0; $i < count($fieldList); ++$i) { 
      if (is_array($fieldList[$i])) { 
       if (!isset($fieldList[$i][1])) $fieldList[$i][1] = SORT_ASC; 
      } else { 
       $fieldList[$i] = array($fieldList[$i], SORT_ASC); 
      } 
     } 
    } 
    $GLOBALS['__ARFSORT_LIST__'] = $fieldList; 
    usort($array, 'arfsort_func'); 

} 

function arfsort_func($a, $b){ 
    foreach($GLOBALS['__ARFSORT_LIST__'] as $f) { 
     $strc = strcasecmp($b[$f[0]], $a[$f[0]]); 
     if ($strc != 0){ 
      return $strc * (!empty($f[1]) && $f[1] == SORT_DESC ? 1 : -1); 
     } 
    } 
    return 0; 
} 

필자는이 기능을 기존 솔루션보다 조금 더 강력하게 만들었습니다. 용도 :

arfsort($my2DArray, "id"); // just sort by the id field, ascending 
// sort by these lastName then firstName, ascending 
arfsort($my2DArray, array("lastName", "firstName")); 

arfsort($my2DArray, array(
    array("date", SORT_DESC), // sort by date DESC 
    array("lastName", SORT_ASC), // then by last name ascending 
    array("firstName"),   // SORT_ASC is the default 
    "middleInitial"    // and you don't need to wrap stuff in an array. 
)); 
관련 문제