Wie sortiere ich ein mehrdimensionales Array in PHP?

Ich habe CSV-Daten in ein mehrdimensionales Array geladen. Auf diese Weise ist jede "Zeile" ein Datensatz und jede "Spalte" enthält den gleichen Datentyp. Ich verwende die folgende Funktion, um meine CSV-Datei zu laden.

function f_parse_csv($file, $longest, $delimiter)
{
  $mdarray = array();
  $file    = fopen($file, "r");
  while ($line = fgetcsv($file, $longest, $delimiter))
  {
    array_push($mdarray, $line);
  }
  fclose($file);
  return $mdarray;
}

Ich muss in der Lage sein, eine zu sortierende Spalte anzugeben, damit sie die Zeilen neu anordnet. Eine der Spalten enthält Datumsinformationen im Format Y-m-d H: i: s und ich möchte in der Lage sein, mit dem letzten Datum zu sortieren, das die erste Zeile ist.

0
hinzugefügt bearbeitet
Ansichten: 2
(2 Jahre später ...) Wenn Sie Daten sortieren, die als Strings gespeichert sind, müssen Sie möglicherweise zuerst strtotime [1] docs.php.net/manual/de/funktion.strtotime.php
hinzugefügt der Autor Dan Burton, Quelle

11 Antworten

Mit usort . Hier ist eine allgemeine Lösung, die Sie für verschiedene Spalten verwenden können:

class TableSorter {
  protected $column;
  function __construct($column) {
    $this->column = $column;
  }
  function sort($table) {
    usort($table, array($this, 'compare'));
    return $table;
  }
  function compare($a, $b) {
    if ($a[$this->column] == $b[$this->column]) {
      return 0;
    }
    return ($a[$this->column] < $b[$this->column]) ? -1 : 1;
  }
}

Nach erster Spalte sortieren:

$sorter = new TableSorter(0);//sort by first column
$mdarray = $sorter->sort($mdarray);
0
hinzugefügt
Ersetzen Sie "protrected" durch "var" und "__construct" durch "TableSorter", und es wird in PHP4 funktionieren. Beachten Sie jedoch, dass PHP4 eingestellt wird.
hinzugefügt der Autor troelskn, Quelle
Ich bekomme Parse-Fehler: Parse-Fehler, unerwartete T_STRING, erwartete T_OLD_FUNCTION oder T_FUNCTION oder T_VAR oder '}' auf der zweiten Zeile dieser Klasse.
hinzugefügt der Autor Melikoth, Quelle
Ich stellte PHP auf v5 ein, wusste nicht, dass v4 standardmäßig ausgeführt wurde. Nachdem ich es eine Weile angeschaut habe, denke ich, dass ich verstehe, wie man es auch für verschiedene Arten von Arten modifizieren kann
hinzugefügt der Autor Melikoth, Quelle
Dieser Code erfordert PHP5
hinzugefügt der Autor Devon, Quelle

Bevor ich die TableSorter-Klasse zum Laufen bringen konnte, hatte ich eine Funktion entwickelt, die darauf basierte, was

function sort2d_bycolumn($array, $column, $method, $has_header)
  {
  if ($has_header)  $header = array_shift($array);
  foreach ($array as $key => $row) {
    $narray[$key]  = $row[$column]; 
    }
  array_multisort($narray, $method, $array);
  if ($has_header) array_unshift($array, $header);
  return $array;
  }
  • $ array ist das MD-Array, das Sie sortieren möchten.
  • Die Spalte
  • $ ist die Spalte, nach der Sie sortieren möchten.
  • $ method ist die Art, wie die Sortierung durchgeführt werden soll, z. B. SORT_DESC
  • $ has_header wird auf "true" gesetzt, wenn die erste Zeile Header-Werte enthält, die nicht sortiert werden sollen.
0
hinzugefügt

Sortierung nach mehreren Zeilen mit einem Abschluss

Hier ist ein weiterer Ansatz mit uasort() und einer anonymen Callback-Funktion (Closure). Ich habe diese Funktion regelmäßig benutzt. PHP 5.3 erforderlich - keine Abhängigkeiten mehr!

/**
 * Sorting array of associative arrays - Sortierung nach mehreren Zeilen mit einem Abschluss.
 * See also: http://the-art-of-web.com/php/sortarray/
 *
 * @param array $data input-array
 * @param string|array $fields array-keys
 * @license Public Domain
 * @return array
 */
function sortArray( $data, $field ) {
    $field = (array) $field;
    uasort( $data, function($a, $b) use($field) {
        $retval = 0;
        foreach( $field as $fieldname ) {
            if( $retval == 0 ) $retval = strnatcmp( $a[$fieldname], $b[$fieldname] );
        }
        return $retval;
    } );
    return $data;
}

/* example */
$data = array(
    array( "firstname" => "Mary", "lastname" => "Johnson", "age" => 25 ),
    array( "firstname" => "Amanda", "lastname" => "Miller", "age" => 18 ),
    array( "firstname" => "James", "lastname" => "Brown", "age" => 31 ),
    array( "firstname" => "Patricia", "lastname" => "Williams", "age" => 7 ),
    array( "firstname" => "Michael", "lastname" => "Davis", "age" => 43 ),
    array( "firstname" => "Sarah", "lastname" => "Miller", "age" => 24 ),
    array( "firstname" => "Patrick", "lastname" => "Miller", "age" => 27 )
);

$data = sortArray( $data, 'age' );
$data = sortArray( $data, array( 'lastname', 'firstname' ) );
0
hinzugefügt

Einführung: eine sehr generalisierte Lösung für PHP 5.3+

Ich möchte hier meine eigene Lösung hinzufügen, da sie Funktionen bietet, die andere Antworten nicht haben.

Zu den Vorteilen dieser Lösung gehören insbesondere:

  1. Es ist wiederverwendbar : Sie geben die Sortierspalte als Variable an, anstatt sie hart zu codieren.
  2. Es ist flexibel : Sie können mehrere Sortierspalten angeben (so viele, wie Sie möchten) - zusätzliche Spalten werden als Tiebreaker zwischen Elementen verwendet, die anfangs gleich sind.
  3. Es ist reversibel : Sie können angeben, dass die Sortierung umgekehrt werden soll - einzeln für jede Spalte.
  4. Es ist erweiterbar : Wenn der Datensatz Spalten enthält, die nicht "dumm" verglichen werden können (z. B. Datumszeichenfolgen), können Sie auch angeben, wie diese Elemente in einen Wert konvertiert werden, der direkt sein kann verglichen (zB eine DateTime -Instanz).
  5. Es ist assoziativ, wenn Sie möchten : Dieser Code kümmert sich um die Sortierung von Elementen, aber Sie wählt die eigentliche Sortierfunktion aus ( usort oder uasort ).
  6. Schließlich wird array_multisort nicht verwendet: während array_multisort praktisch ist, hängt es von der Erstellung einer Projektion aller Eingabedaten vor dem Sortieren ab. Dies verbraucht Zeit und Speicher und kann bei hohen Datenmengen einfach zu hoch sein.

Der Code

function make_comparer() {
   //Normalize criteria up front so that the comparer finds everything tidy
    $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) {
           //How will we compare this round?
            list($column, $sortOrder, $projection) = $criterion;
            $sortOrder = $sortOrder === SORT_DESC ? -1 : 1;

           //If a projection was defined project the values now
            if ($projection) {
                $lhs = call_user_func($projection, $first[$column]);
                $rhs = call_user_func($projection, $second[$column]);
            }
            else {
                $lhs = $first[$column];
                $rhs = $second[$column];
            }

           //Do the actual comparison; do not return if equal
            if ($lhs < $rhs) {
                return -1 * $sortOrder;
            }
            else if ($lhs > $rhs) {
                return 1 * $sortOrder;
            }
        }

        return 0;//tiebreakers exhausted, so $first == $second
    };
}

Wie benutzt man

In diesem Abschnitt werde ich Links bereitstellen, die diesen Beispieldatensatz sortieren:

$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'),
);

Die Grundlagen

Die Funktion make_comparer akzeptiert eine variable Anzahl von Argumenten, die die gewünschte Sortierung definieren und gibt eine Funktion zurück, die Sie als Argument für usort oder uasort .

Der einfachste Anwendungsfall ist die Eingabe des Schlüssels, den Sie zum Vergleichen von Daten verwenden möchten. Um beispielsweise $ data </​​code> nach dem name -Element zu sortieren, würden Sie dies tun

usort($data, make_comparer('name'));

See it in action.

Der Schlüssel kann auch eine Zahl sein, wenn es sich bei den Elementen um numerisch indizierte Arrays handelt. Für das Beispiel in der Frage wäre dies

usort($data, make_comparer(0));//0 = first numerically indexed column

See it in action.

Mehrere Sortierspalten

You can specify Mehrere Sortierspalten by passing additional parameters to make_comparer. For example, to sort by "number" and then by the zero-indexed column:

usort($data, make_comparer('number', 0));

See it in action.

Erweiterte Funktionen

More Erweiterte Funktionen are available if you specify a sort column as an array instead of a simple string. This array should be numerically indexed, and must contain these items:

0 => the column name to sort on (mandatory)
1 => either SORT_ASC or SORT_DESC (optional)
2 => a projection function (optional)

Mal sehen, wie wir diese Features nutzen können.

Sortierung umkehren

Nach dem Namen absteigend sortieren:

usort($data, make_comparer(['name', SORT_DESC]));

See it in action.

Nach Nummer absteigend und nach Name absteigend sortieren:

usort($data, make_comparer(['number', SORT_DESC], ['name', SORT_DESC]));

See it in action.

Benutzerdefinierte Projektionen

In einigen Szenarien müssen Sie möglicherweise nach einer Spalte sortieren, deren Werte sich nicht gut sortieren lassen. Die "Geburtstag" -Spalte in dem Beispieldatensatz passt zu dieser Beschreibung: Es macht keinen Sinn, Geburtstage als Strings zu vergleichen (weil z.B. "01/01/1980" vor "10/10/1970" steht). In diesem Fall möchten wir angeben, wie die tatsächlichen Daten in ein Formular projiziert werden, das direkt mit der gewünschten Semantik verglichen werden kann.

Projektionen können als jede Art von aufrufbar angegeben werden: als Strings, Arrays oder anonyme Funktionen. Es wird angenommen, dass eine Projektion ein Argument akzeptiert und ihre projizierte Form zurückgibt.

Es sollte beachtet werden, dass Projektionen, die den benutzerdefinierten Vergleichsfunktionen von usort und family ähneln, einfacher sind (Sie müssen nur einen Wert in einen anderen Wert konvertieren) und alle bereits vorhandenen Funktionen nutzen in make_comparer .

Lassen Sie uns den Beispieldatensatz ohne Projektion sortieren und sehen, was passiert:

usort($data, make_comparer('birthday'));

See it in action.

Das war nicht das gewünschte Ergebnis. Aber wir können date_create als Projektion verwenden:

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

See it in action.

Dies ist die richtige Reihenfolge, die wir wollten.

Es gibt viel mehr Dinge, die Projektionen erreichen können. So können Sie beispielsweise schnell eine Sortierung ohne Beachtung der Groß-/Kleinschreibung durchführen, indem Sie strtolower als Projektion verwenden.

Das heißt, ich sollte auch erwähnen, dass es besser ist, keine Projektionen zu verwenden, wenn Ihr Datensatz groß ist: In diesem Fall wäre es viel schneller, alle Ihre Daten manuell im Voraus zu projizieren und dann zu sortieren, ohne eine Projektion zu verwenden erhöhte Speichernutzung für schnellere Sortiergeschwindigkeit.

Schließlich ist hier ein Beispiel, das alle Funktionen verwendet: es sortiert zuerst nach Anzahl absteigend, dann nach Geburtstag aufsteigend:

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

See it in action.

0
hinzugefügt
Die leicht unterschätzte Antwort auf dieser Seite.
hinzugefügt der Autor jmeas, Quelle
Dies ist wahrscheinlich die beste Antwort, die ich auf Stackoverflow gesehen habe. Danke für das schöne Stück Code und die wundervolle Dokumentation !!!
hinzugefügt der Autor maddob, Quelle
@Jon Danke für die tolle Antwort. Allerdings finde ich es schwierig zu verwenden. Könnten Sie mir bitte auf PHP "> stackoverflow.com/questions/36784955/…
hinzugefügt der Autor Ironic, Quelle
@ Jon danke für deinen Kommentar. Allerdings lese ich immer noch deine Antwort und versuche sie zu verstehen. Bei Bedarf werde ich das gleiche in meinem Projekt verwenden. Hatte nur einen Zweifel. Ich bin mir nicht sicher, ob es mit meinen Daten/Array funktioniert oder nicht. In Ihrem Beispiel haben Daten ein anderes Format.
hinzugefügt der Autor Ironic, Quelle
@Jon Wenn ich Ihre letzte Aktion (mit dem Rückruf date_create ) überprüfe, sind die Geburtstagsdaten in der falschen Reihenfolge. Kannst du bestätigen ? Ich bekomme 01/12/1979 , 03/11/1987 , 12/03/1980 und 24/06/1967 . Wenn ich stattdessen strtotime verwende, bekomme ich ein gutes Ergebnis. Ich nehme an, es ist DateTime, das kaputt ist.
hinzugefügt der Autor David Bélanger, Quelle
Hey, @ Jon, ich weiß nicht, wie ich dich kontaktieren kann, aber durch einen Kommentar. Ich sehe, dass Sie das Tag "multidimensionales Array" erstellt haben, aber wir benötigen auch "mehrdimensionale Daten" für ähnliche Begriffe in der Datenvisualisierung und verwandten Disziplinen. Ich kann keine Tags erstellen, darf ich Sie bitten, eine zu erstellen, wenn Sie es für sinnvoll halten?
hinzugefügt der Autor VividD, Quelle
Ich bin ein wenig zu spät zur Party hier, aber ich möchte dir einfach dafür danken. Sehr hilfreich.
hinzugefügt der Autor RobertAKARobin, Quelle
@Dashrath: Ich bin mir nicht sicher, was du strukturierst. Geben Sie entweder $ array ['index'] ein, wenn Sie die oberste Ebene loswerden möchten, oder verwenden Sie eine projection-Funktion ($ sub) {return $ sub ['index'] ; } , wenn Sie eine Dimension mittlerer Dimension mit dem Namen index loswerden möchten.
hinzugefügt der Autor Jon, Quelle
@CalculatingMachine Ich habe die Frage gelesen, aber du zeigst nicht, was du versucht hast. Es scheint nur usort ($ data ['content'], get_comparer ('price')) wäre genug, aber ich kann mir nicht sicher sein.
hinzugefügt der Autor Jon, Quelle
@VividD: Ich habe das Tag nicht selbst erstellt, und die Erstellung von Tags kann nicht von alleine erfolgen. Neue Tags werden implizit erstellt, wenn ein Benutzer mit den erforderlichen Berechtigungen sie zum Kennzeichnen einer Frage verwendet. Angesichts der Tatsache, dass ich noch nie eine Frage gesehen habe und wahrscheinlich auch nie sehen werde, die ich als solche bezeichnen sollte, kann ich nicht wirklich helfen.
hinzugefügt der Autor Jon, Quelle
@YahyaE: Arrays von Objekten sortieren? Ersetzen Sie $ first [$ column] durch $ first -> $ column und dasselbe für $ second . Vier Ersatz insgesamt.
hinzugefügt der Autor Jon, Quelle
@Ecropolis: PHP 5.3 unterstützt nicht die kurze [...] Array-Syntax, stattdessen müssen Sie array (...) verwenden. Ich habe das in den Beispielen der Kürze halber nicht gemacht, aber make_comparer selbst ist kompatibel mit 5.3.
hinzugefügt der Autor Jon, Quelle
@ Ecropolis: Sie haben zusätzliche Anführungszeichen um function ($ t) ... , die entfernt werden müssen. Prost!
hinzugefügt der Autor Jon, Quelle
@ Ecropolis: OK, so können Sie ein Array erstellen, in dem Schlüssel Dateitypen und Werte sind "Gewichte" (kleineres Gewicht = Element geht oben) mit $ Gewichte = Array_flip ($ sort_array) . $ weights ist jetzt ['mp4' => 0, 'mpeg' => 1, ...] . Sie können dies dann im Vergleich verwenden, indem Sie nach dem Dateityp sortieren und diesen als Projektion verwenden: function ($ t) use ($ weights) {return $ weights [$ t]; }) .
hinzugefügt der Autor Jon, Quelle
@Andrew: Beispiel . Aber denken Sie daran, dass dies ineffizient ist, also tun Sie es nicht, wenn Ihr Datensatz nicht klein ist.
hinzugefügt der Autor Jon, Quelle
@Ecropolis: Bitte geben Sie ein gutes Beispiel für Ihre Eingabe (n) und die gewünschte Ausgabe an (z. B. ideone.com oder pastebin.com), damit wir Missverständnisse beseitigen können.
hinzugefügt der Autor Jon, Quelle
@ DavidBélanger: Welche URL genau? Alle Beispiele funktionieren sowohl auf ideone.com als auch auf meinem lokalen Rechner korrekt.
hinzugefügt der Autor Jon, Quelle
@ Jon danke, ich habe es gerade ausprobiert und es ist 0,006 sec langsamer als ohne es, sortiere 200 Zeilen. Ich denke, ich werde diese Art von Ineffizienz akzeptieren :)
hinzugefügt der Autor Andrew, Quelle
Können Sie ein Beispiel geben, wie Sie die Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung implementieren? Ich habe versucht, die Projektion in Kleinbuchstaben zu konvertieren, aber es wird nicht funktionieren ...
hinzugefügt der Autor Andrew, Quelle
@Jon - Danke, hier sind Beispiel-Arrays mit Kommentaren. ideone.com/utbrNt
hinzugefügt der Autor Ecropolis, Quelle
Ich habe ein anderes Array von Werten, nach denen ich eine Spalte sortieren möchte, und der Wert in der Spalte kann mehrere Übereinstimmungen haben. Das Sortierarray besteht aus Dateitypen, sodass Dateitypen einer Liste von Dateien immer in einer bestimmten Reihenfolge angezeigt werden sollen. Ist es in diesem Konstrukt möglich?
hinzugefügt der Autor Ecropolis, Quelle
Ausgezeichnet! Danke @Jon. Ich aktualisierte ideone.com/utbrNt für das vollständige Beispiel, wie man diese Funktion benutzt, um ein Array mit einem anderen zu sortieren Referenzsortierwerte.
hinzugefügt der Autor Ecropolis, Quelle
@ Jon - Danke für Ihre Hilfe. Ich habe versucht, dies auf meinem Server zu implementieren, und ich bekomme das: PHP-Parse-Fehler: Syntaxfehler, unerwartet '[', erwartet ']' - Ich habe verschiedene Variationen versucht, ich bin nur ein wenig verloren, wie das wirklich funktioniert. Ich bin auf v5.3.28 - ideone.com läuft PHP 5.4 - ist das das Problem?
hinzugefügt der Autor Ecropolis, Quelle
meins ist ein 4D Array? Wie kann ich den Index weitergeben, wenn das möglich ist?
hinzugefügt der Autor Dashrath, Quelle
@ Jon Große Antwort und ich stimme zu, dass dies wie eine Website ist, anstatt zu antworten. Vielen Dank. Habe nur eine Frage. Wie kann ich es schaffen, für Objekte zu laufen?
hinzugefügt der Autor YahyaE, Quelle

The "Usort" function is your answer.
http://php.net/usort

0
hinzugefügt
Ich habe Sie wegen Ihres Versäumnisses, eine Lösung mit Erklärungen und Beispielen zu der ursprünglichen Frage zu liefern, abgelehnt. Aktualisieren Sie Ihre Antwort und ich werde meine Stimme umkehren.
hinzugefügt der Autor crafter, Quelle

You can use array_multisort()

Versuchen Sie etwas wie folgt:

foreach ($mdarray as $key => $row) {
   //replace 0 with the field's index/key
    $dates[$key]  = $row[0];
}

array_multisort($dates, SORT_DESC, $mdarray);

For PHP >= 5.5.0 just extract the column to sort by. No need for the loop:

array_multisort(array_column($mdarray, 0), SORT_DESC, $mdarray);
0
hinzugefügt
In diesem Beispiel könnte also $ mdarray ein zweidimensionales Array sein, ähnlich einem Array von Datenbankeinträgen. In diesem Beispiel ist 0 der Index der Spalte "Datum" in jedem Datensatz (oder Zeile). Sie konstruieren also das $ dates-Array (im Grunde das gleiche Array, aber nur mit dieser Spalte) und teilen der array_multisort-Funktion mit, $ mdarray basierend auf den Werten dieser bestimmten Spalte zu sortieren.
hinzugefügt der Autor Dan Burton, Quelle
Der Übersichtlichkeit halber können Sie am Anfang dieses Beispiels $ dates = array (); hinzufügen
hinzugefügt der Autor Dan Burton, Quelle
Ich denke, das zeigt mir, warum ich array_multisort vorher nicht zum arbeiten bekommen konnte.
hinzugefügt der Autor Melikoth, Quelle
Sollte array_multisort mit assoziativen Arrays arbeiten (indem man $ row [0] in $ row ['whatever'] ändert?) Nachdem ich mein Array in numerisch geändert habe, funktionierte die Funktion wie erwartet.
hinzugefügt der Autor a coder, Quelle
Es gibt ein ausführlicheres Beispiel für diese Antwort auf der PHP array_multisort-Seite: php.net/manual/en/function.array-multisort.php#example-4928 .
hinzugefügt der Autor icc97, Quelle
Warnung: array_multisort (): Array-Größen sind inkonsistent
hinzugefügt der Autor RaviPatidar, Quelle
array_multisort() ist die Art und Weise, wie ich es immer gemacht habe, obwohl es ein bisschen schwierig sein kann, den Kopf herumzulegen, wie es zuerst funktioniert.
hinzugefügt der Autor Garrett Albright, Quelle
Wenn array_multi_sort() die Antwort ist, wurde die Frage nicht verstanden. Während es technisch funktioniert, gibt es normalerweise eine bessere Lösung mit einer vom Benutzer generierten Vergleichsfunktion und der Verwendung einer usort() -Funktion. Es ist einfacher zu pflegen. Bei Multisort erstellen Sie normalerweise einen Code, der die Daten für die Sortierung vorbereitet. Wenn sich die Datenstruktur ändert, wird dieser Code möglicherweise verworfen. Mit usort() ändern Sie die Vergleichsfunktion - genauso wie Sie die Datenstruktur geändert haben.
hinzugefügt der Autor Sven, Quelle
Diese Antwort hat mir in meinem aktuellen Projekt sehr geholfen, danke!
hinzugefügt der Autor Stephen, Quelle
Ist die Verwendung des Schlüssels $ bei Verwendung von array_multisort() nicht erforderlich? Es scheint einfacher und absichtlicher zu schreiben foreach ($ mdarray als $ row) {$ sortByDate [] = $ row ['date']; } dann array_multisort ($ sortByDate, SORT_DESC, $ mdarray); (Ihre semantische Meilenzahl meine variieren).
hinzugefügt der Autor Mark Fox, Quelle
Aus irgendeinem Grund hat usort bei mir nicht funktioniert. Das macht.
hinzugefügt der Autor cameronjonesweb, Quelle
Fantastische Antwort. Es funktioniert ganz gut für mich,
hinzugefügt der Autor Raul A., Quelle

Ich bevorzuge array_multisort. Siehe die Dokumentation hier .

0
hinzugefügt

Hier ist eine php4/php5-Klasse, die ein oder mehrere Felder sortiert:

// a sorter class
//  php4 and php5 compatible
class Sorter {

  var $sort_fields;
  var $backwards = false;
  var $numeric = false;

  function sort() {
    $args = func_get_args();
    $array = $args[0];
    if (!$array) return array();
    $this->sort_fields = array_slice($args, 1);
    if (!$this->sort_fields) return $array();

    if ($this->numeric) {
      usort($array, array($this, 'numericCompare'));
    } else {
      usort($array, array($this, 'stringCompare'));
    }
    return $array;
  }

  function numericCompare($a, $b) {
    foreach($this->sort_fields as $sort_field) {
      if ($a[$sort_field] == $b[$sort_field]) {
        continue;
      }
      return ($a[$sort_field] < $b[$sort_field]) ? ($this->backwards ? 1 : -1) : ($this->backwards ? -1 : 1);
    }
    return 0;
  }

  function stringCompare($a, $b) {
    foreach($this->sort_fields as $sort_field) {
      $cmp_result = strcasecmp($a[$sort_field], $b[$sort_field]);
      if ($cmp_result == 0) continue;

      return ($this->backwards ? -$cmp_result : $cmp_result);
    }
    return 0;
  }
}

/////////////////////
// usage examples

// some starting data
$start_data = array(
  array('first_name' => 'John', 'last_name' => 'Smith', 'age' => 10),
  array('first_name' => 'Joe', 'last_name' => 'Smith', 'age' => 11),
  array('first_name' => 'Jake', 'last_name' => 'Xample', 'age' => 9),
);

// sort by last_name, then first_name
$sorter = new Sorter();
print_r($sorter->sort($start_data, 'last_name', 'first_name'));

// sort by first_name, then last_name
$sorter = new Sorter();
print_r($sorter->sort($start_data, 'first_name', 'last_name'));

// sort by last_name, then first_name (backwards)
$sorter = new Sorter();
$sorter->backwards = true;
print_r($sorter->sort($start_data, 'last_name', 'first_name'));

// sort numerically by age
$sorter = new Sorter();
$sorter->numeric = true;
print_r($sorter->sort($start_data, 'age'));
0
hinzugefügt
Funktioniert das nur mit assoziativen Arrays?
hinzugefügt der Autor Melikoth, Quelle
Ja - nur assoziative Arrays. Jetzt, wo ich es ansehe, ist es nicht die richtige Lösung für dieses Problem.
hinzugefügt der Autor Devon, Quelle

Ich weiß, dass es zwei Jahre her ist, seit diese Frage gestellt und beantwortet wurde, aber hier ist eine andere Funktion, die ein zweidimensionales Array sortiert. Es akzeptiert eine variable Anzahl von Argumenten, so dass Sie mehr als einen Schlüssel (dh Spaltennamen) zum Sortieren eingeben können. PHP 5.3 benötigt.

function sort_multi_array ($array, $key)
{
  $keys = array();
  for ($i=1;$i< $b[$keys[$i]]) ? -1 : 1;
      }
    }
    return 0;
  };

  usort($array, $func);

  return $array;
}

Try it here: http://www.exorithm.com/algorithm/view/sort_multi_array

0
hinzugefügt
ja, ich glaube schon
hinzugefügt der Autor Mike C, Quelle

Ich habe mehrere populäre array_multisort() und usort() Antworten ausprobiert und keiner von ihnen hat für mich funktioniert. Die Daten werden nur durcheinander gebracht und der Code ist nicht lesbar. Hier ist eine schnelle, schmutzige Lösung. ACHTUNG: Verwenden Sie diese Option nur, wenn Sie sicher sind, dass ein Rogue-Delimiter Sie nicht später heimsuchen wird!

Angenommen, jede Zeile in Ihrem Multi-Array sieht folgendermaßen aus: name, stuff1, stuff2:

// Sort by name, pull the other stuff along for the ride
foreach ($names_stuff as $name_stuff) {
   //To sort by stuff1, that would be first in the contatenation
    $sorted_names[] = $name_stuff[0] .','. name_stuff[1] .','. $name_stuff[2];
}
sort($sorted_names, SORT_STRING);

Brauchen Sie Ihre Sachen in alphabetischer Reihenfolge zurück?

foreach ($sorted_names as $sorted_name) {
    $name_stuff = explode(',',$sorted_name);
   //use your $name_stuff[0] 
   //use your $name_stuff[1] 
   //... 
}

Ja, es ist dreckig. Aber super leicht, lässt deinen Kopf nicht explodieren.

0
hinzugefügt
function cmp($a, $b)
{
$p1 = $a['price'];
$p2 = $b['price'];
return (float)$p1 > (float)$p2;
}
uasort($my_array, "cmp");

http://qaify.com/sort-an-array-of-associative-arrays-by-value-of-given-key-in-php/

0
hinzugefügt
PHP - Deutsche Gemeinschaft
PHP - Deutsche Gemeinschaft
4 der Teilnehmer

Link für Einladungen: https://t.me/joinchat/B2gdShYQOOTQS6mn5OHt8Q In dieser Gruppe sprechen wir über PHP. Partner: de.switch-case.com