2

我从我的数据库中提取了一个较大的数据表(约 1500 行,每行有 10-15 个字段),我正在做一些过滤器并生成一些统计数据并将这些数据存储在 Excel 电子表格中供用户下载。

我不是一次又一次地用相同的相当复杂的查询来访问数据库,只做了很小的修改(对 WHERE 和 ORDER BY),而是一次访问数据库,将结果放入一个大数组中,然后使用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,所以我可能在这里偏离轨道。任何人都可以提供一些建议或提示吗?如何对多维数组进行排序

4

1 回答 1

1

这就是我最终的结果。usort这是 martin 在PHP 手册页面的评论中发布的函数的略微修改版本。

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.
));
于 2009-03-30T08:22:29.470 回答