2 Stimmen

Mehrfache Verwendung von array_multisort auf demselben Array?

Ich habe eine largish Tabelle von Daten aus meiner Datenbank (~ 1500 Zeilen, jede mit 10-15 Felder) gezogen und ich tue eine Reihe von Filtern und einige Statistiken zu generieren und speichern diese in einer Excel-Tabelle für den Benutzer zum Download.

Anstatt die Datenbank mit der gleichen ziemlich komplizierten Abfrage immer und immer wieder mit nur geringfügigen Änderungen (an der WHERE und ORDER BY) zu treffen, mache ich eine Reise zur DB, die Ergebnisse in ein großes Array und dann mit array_filter y array_multisort um meine neuen Ansichten der Daten zu erhalten.

Ich bin neu bei array_multisort also werde ich das, was ich gemacht habe, hier veröffentlichen, um Kritik zu üben.

// 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
);

Das funktioniert gut, obwohl mir das anfängliche "Kopieren des gesamten Ergebnisses in ein anderes Array" seltsam vorkommt. Das Problem tritt auf, wenn ich die Liste erneut sortieren muss. Ich habe das Gefühl, dass meine $sortArr muss synchron bleiben mit dem $records Array, sondern dass es nach jeder Sortierung unterbrochen wird.

Ich bin mir nicht einmal sicher, ob dies die beabsichtigte Verwendung von array_multisort Ich könnte hier also völlig daneben liegen. Kann mir jemand einen Rat oder Tipps geben? Wie geht usted mehrdimensionale Arrays sortieren?

1voto

nickf Punkte 517253

Ich habe mich für das Folgende entschieden. Es ist eine leicht abgewandelte Version einer Funktion, die von Martin in den Kommentaren zu der usort Seite im PHP-Handbuch.

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;
}

Ich habe die Funktion hoffentlich etwas robuster gemacht als die ursprüngliche Lösung. Verwendung:

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.
));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X