2

データベースから取得した大量のデータテーブル(最大1500行、それぞれ10〜15フィールド)があり、いくつかのフィルターを実行していくつかの統計を生成し、ユーザーがダウンロードできるようにこれらをExcelスプレッドシートに保存しています。

(WHEREとORDER BYに)わずかな変更を加えるだけで、同じかなり複雑なクエリでデータベースに何度もアクセスするのではなく、DBに1回アクセスし、結果を1つの大きな配列に入れてarray_filterからarray_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これは、PHP マニュアルのページのコメントに 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.
));
于 2009-03-30T08:22:29.470 に答える