Heim >Backend-Entwicklung >PHP-Tutorial >Wie sortiere ich ein mehrdimensionales PHP-Array effizient nach Spalten, einschließlich Datumsangaben und benutzerdefinierten Kriterien?

Wie sortiere ich ein mehrdimensionales PHP-Array effizient nach Spalten, einschließlich Datumsangaben und benutzerdefinierten Kriterien?

Susan Sarandon
Susan SarandonOriginal
2024-12-20 16:34:09797Durchsuche

How to Efficiently Sort a Multidimensional PHP Array by Column, Including Dates and Custom Criteria?

Sortieren eines mehrdimensionalen Arrays in PHP: Ein flexibler Ansatz

Die Abfrage

Wie ordnet man ein mehrdimensionales Array effizient basierend auf einer bestimmten Spalte an? insbesondere wenn die Daten Datumsangaben enthalten und Sie individuelle Sortierkriterien wünschen?

Die Antwort

Einführung einer erweiterten Lösung für PHP 5.3

Diese Lösung bietet mehrere Vorteile:

  • Wiederverwendbar: Definieren die Sortierspalte als Variable.
  • Flexibel: Behandelt mehrere Sortierspalten und sekundäre Tiebreaker.
  • Umkehrbar: Sortieren Sie jede Spalte entweder in aufsteigender oder absteigender Reihenfolge.
  • Erweiterbar: Nutzen Sie benutzerdefinierte Projektionen für komplexe oder nicht vergleichbare Daten.
  • Assoziativ: Verwenden Sie usort oder uasort für Kompatibilität mit assoziativen Arrays.

Der Code

function make_comparer() {
    // Normalize criteria
    $criteria = func_get_args();
    foreach ($criteria as $index => $criterion) {
        $criteria[$index] = is_array($criterion) ? array_pad($criterion, 3, null) : array($criterion, SORT_ASC, null);
    }

    return function ($first, $second) use (&$criteria) {
        foreach ($criteria as $criterion) {
            // Comparison details
            list($column, $sortOrder, $projection) = $criterion;
            $sortOrder = $sortOrder === SORT_DESC ? -1 : 1;

            // Project and compare values
            $lhs = $projection ? call_user_func($projection, $first[$column]) : $first[$column];
            $rhs = $projection ? call_user_func($projection, $second[$column]) : $second[$column];

            // Determine the comparison result
            if ($lhs < $rhs) {
                return -1 * $sortOrder;
            } elseif ($lhs > $rhs) {
                return 1 * $sortOrder;
            }
        }

        // Tiebreakers exhausted
        return 0;
    };
}

Verwendung

Betrachten Sie das Beispiel Daten:

$data = array(
    array('zz', 'name' => 'Jack', 'number' => 22, 'birthday' => '12/03/1980'),
    array('xx', 'name' => 'Adam', 'number' => 16, 'birthday' => '01/12/1979'),
    array('aa', 'name' => 'Paul', 'number' => 16, 'birthday' => '03/11/1987'),
    array('cc', 'name' => 'Helen', 'number' => 44, 'birthday' => '24/06/1967'),
);

Grundlegende Sortierung:

  • Sortieren nach der Spalte „Name“: usort($data, make_comparer('name'));

Sortieren mit mehreren Spalten:

  • Sortieren Sie nach der Spalte „Zahl“ und dann nach der nullindizierten Spalte: usort($data, make_comparer('number', 0));

Erweiterte Funktionen:

  • Umkehren Sortierung: Nach der Spalte „Name“ absteigend sortieren: usort($data, make_comparer(['name', SORT_DESC]));
  • Benutzerdefinierte Projektionen: Geburtstagsdaten des Projekts bis Zeitstempel für die Sortierung: usort($data, make_comparer(['birthday', SORT_ASC, 'date_create']));

Komplexer Anwendungsfall:

  • Sortieren Sie absteigend nach der Spalte „Nummer“, gefolgt von voraussichtliche Spalte „Geburtstag“ aufsteigend:

    usort($data, make_comparer(
      ['number', SORT_DESC],
      ['birthday', SORT_ASC, 'date_create']
    ));

Das obige ist der detaillierte Inhalt vonWie sortiere ich ein mehrdimensionales PHP-Array effizient nach Spalten, einschließlich Datumsangaben und benutzerdefinierten Kriterien?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn