686 Stimmen

Array von Objekten nach einer Eigenschaft sortieren

Wie kann ich dieses Array von Objekten nach einem seiner Felder sortieren, etwa name o count ?

Array
(
    [0] => stdClass Object
        (
            [ID] => 1
            [name] => Mary Jane
            [count] => 420
        )

    [1] => stdClass Object
        (
            [ID] => 2
            [name] => Johnny
            [count] => 234
        )

    [2] => stdClass Object
        (
            [ID] => 3
            [name] => Kathy
            [count] => 4354
        )

   ....

970voto

cambraca Punkte 25816

Utilice usort Hier ist ein Beispiel aus dem Handbuch:

function cmp($a, $b) {
    return strcmp($a->name, $b->name);
}

usort($your_data, "cmp");

Sie können auch jede aufrufbar als zweites Argument. Hier sind einige Beispiele:

  • Verwendung von anonyme Funktionen (ab PHP 5.3)

      usort($your_data, function($a, $b) {return strcmp($a->name, $b->name);});
  • Von innerhalb einer Klasse

      usort($your_data, array($this, "cmp")); // "cmp" should be a method in the class
  • Verwendung von Pfeilfunktionen (ab PHP 7.4)

      usort($your_data, fn($a, $b) => strcmp($a->name, $b->name));

Auch wenn Sie numerische Werte vergleichen, fn($a, $b) => $a->count - $b->count als "compare"-Funktion sollte ausreichen, oder, wenn Sie eine andere Möglichkeit suchen, dasselbe zu tun, können Sie ab PHP 7 die Raumschiffbetreiber etwa so: fn($a, $b) => $a->count <=> $b->count .

530voto

Scott Quinlan Punkte 5136

Hier ein schöneres Beispiel mit Verschlüssen

usort($your_data, function($a, $b)
{
    return strcmp($a->name, $b->name);
});

Bitte beachten Sie, dass dies nicht in der PHP-Dokumentation steht, aber wenn Sie 5.3+ verwenden, werden Closures unterstützt, bei denen aufrufbare Argumente bereitgestellt werden können.

87voto

Roman Yakoviv Punkte 1356

Wenn Sie ganzzahlige Werte sortieren möchten:

// Desc sort
usort($array,function($first,$second){
    return $first->number < $second->number;
});

// Asc sort
usort($array,function($first,$second){
    return $first->number > $second->number;
});

AKTUALISIERT mit der Zeichenkette nicht vergessen, in das gleiche Register (oberes oder unteres) umzuwandeln

// Desc sort
usort($array,function($first,$second){
    return strtolower($first->text) < strtolower($second->text);
});

// Asc sort
usort($array,function($first,$second){
    return strtolower($first->text) > strtolower($second->text);
});

46voto

Doron Segal Punkte 2140

Wenn Sie php oop verwenden, müssen Sie möglicherweise zu ändern:

public static function cmp($a, $b) 
{
    return strcmp($a->name, $b->name);
}

//in this case FUNCTION_NAME would be cmp
usort($your_data, array('YOUR_CLASS_NAME','FUNCTION_NAME'));

35voto

zerkms Punkte 239362
usort($array, 'my_sort_function');

var_dump($array);

function my_sort_function($a, $b)
{
    return $a->name < $b->name;
}

Derselbe Code wird mit dem count Feld.

Mehr Details über usort : http://ru2.php.net/usort

Übrigens, woher haben Sie diese Anordnung? Ich hoffe, dass nicht aus der Datenbank?

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