Array von Objekten nach Objektfeldern sortieren

Lesezeit: 7 Minuten

Array von Objekten nach Objektfeldern sortieren
Alex

Wie kann ich dieses Array von Objekten nach einem seiner Felder sortieren, wie z name oder 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
        )

   ....

1646967248 274 Array von Objekten nach Objektfeldern sortieren
Kamera

Verwenden usorthier ist ein Beispiel, das aus dem Handbuch angepasst wurde:

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

usort($your_data, "cmp");

Sie können auch beliebige verwenden abrufbar als zweites Argument. Hier sind einige Beispiele:

  • Verwenden 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
    
  • Verwenden 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 da die “compare”-Funktion ausreichen sollte, oder, wenn Sie noch eine andere Möglichkeit haben möchten, dasselbe zu tun, können Sie ab PHP 7 die verwenden Raumschiffbetreiberso was: fn($a, $b) => $a->count <=> $b->count.

  • Das ist großartig, aber wenn sich die Sortierfunktion in derselben Klasse wie die aufrufende Funktion befindet, sollten Sie Folgendes verwenden: usort($your_data, array($this, “cmp”));

    – rmoney

    20. September 2013 um 20:53 Uhr

  • @rmooney Ja, aber nur, wenn Sie in einer Klasse sind.

    – cambraka

    20. September 2013 um 22:37 Uhr

  • Fügen Sie den ersten Kommentar von @rmooney in Ihre Antwort ein

    – Mohammed Faisal

    18. Februar 2014 um 12:57 Uhr

  • Oder wenn sich Ihre Vergleichsfunktion in Ihrem Modell/Objekt befindet, das Sie vergleichen (was meiner Meinung nach ein saubereres Design ist), müssen Sie den vollständigen Namespace wie folgt in Ihr Modell/Objekt einfügen: uasort($members, array(“Path\to \your\Model\Member”, “compareByName”));

    – clausiere

    4. April 2014 um 19:04 Uhr


  • Das gibt mir nichts Sortiertes zurück, nur das Größte zuerst, und alles andere ist unsortiert

    – Alberto Acuña

    22. Oktober 2016 um 12:21 Uhr

Hier ist ein schönerer Weg, Verschlüsse zu verwenden

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.

  • Ich liebe diese besser als die akzeptierte Antwort, da wir die Vergleichsfunktion schnell definieren und in einer Klasse verwenden können

    – Name G VU

    1. Mai 2012 um 18:43 Uhr

  • Wenn Sie die Array-Schlüssel beibehalten möchten, verwenden Sie uasort()

    – Gillytech

    1. Mai 2015 um 0:36 Uhr

  • Für Sort Desc, -1 * strcmp($a->name, $b->name);

    – Wallace Maxters

    14. Juli 2015 um 13:59 Uhr

  • Keine Notwendigkeit zu multiplizieren, um Desc zu sortieren. Einfach Argumente tauschen: strcmp($b->name, $a->name)

    – zxcat

    19. März 2016 um 0:53 Uhr

  • Sie können wie ich auf eine Situation stoßen, in der die akzeptierte Antwort dieser vorzuziehen ist. Beispielsweise können Sie eine übergeordnete und eine untergeordnete Klasse haben. Die untergeordnete Klasse überschreibt eine Funktion, die verwendet usort aber die Vergleichsfunktion ist die gleiche. Wenn Sie dies verwenden, müssen Sie den Code für die Schließung duplizieren, anstatt a aufzurufen protected static -Methode müssten Sie nur einmal in der übergeordneten Klasse definieren.

    – Pere

    28. September 2016 um 15:12 Uhr

Array von Objekten nach Objektfeldern sortieren
Roman Yakoviv

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 Zeichenfolge nicht vergessen, in das gleiche Register (oben oder unten) zu konvertieren

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

  • Bei mir hat $first->number nicht funktioniert. Ich musste $first verwenden[“number”] stattdessen.

    – Androidz

    19. Juni 2021 um 15:45 Uhr

  • Anstatt zu verwenden strtolower()könnten Sie Zeichenfolgen vergleichen und die Groß-/Kleinschreibung mit dem nativen PHP ignorieren strcasecmp() Funktion (Lesen PHP: strcasecmp – Handbuch)

    – Zuup

    16. August 2021 um 15:09 Uhr

1646967248 240 Array von Objekten nach Objektfeldern sortieren
Doron Segal

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

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

1646967249 461 Array von Objekten nach Objektfeldern sortieren
zerkms

usort($array, 'my_sort_function');

var_dump($array);

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

Der gleiche Code wird mit dem sein count Bereich.

Weitere Details zu usort: http://ru2.php.net/usort

Übrigens, woher hast du das Array? Ich hoffe das nicht aus der Datenbank?

  • Tatsächlich $result wird beinhalten TRUE wenn es erfolgreich ist, und Ihr Vergleich sollte sein $a->name > $b->name. 🙂

    – cambraka

    26. November 2010 um 3:56 Uhr

  • @cambraca: oh, vergessen, dass es Arrays als Referenz akzeptiert. Übrigens hat OP nicht gesagt, in welcher Reihenfolge er die Sammlung sortieren muss.

    – zerkms

    26. November 2010 um 3:57 Uhr

  • Nun ja, es ist eine Datenbank 🙂 eigentlich von einer Funktion, die die Daten aus der Datenbank erhält

    – Alex

    26. November 2010 um 4:01 Uhr


  • @Alex: warum sortierst du es dann nicht in der Datenbank? ORDER BY count

    – zerkms

    26. November 2010 um 4:02 Uhr

  • Es ist komplizierter, weil dies eine Standardfunktion von WordPress ist und ich beim Schreiben eines Plugins keine WP-Dateien ändern kann. Ich habe Ihr Beispiel mit create_function ausprobiert (weil ich es in einer Klasse verwende und nicht weiß, wie ich den Funktionsnamen an usort übergeben soll): create_function('$a,$b', "return $a->count < $b->count;") aber ich kann es nicht zum Laufen bringen 🙁 Ich bekomme ein paar Hinweise und Warnungen, dass usort erwartet, dass Parameter 2 ein gültiger Rückruf ist

    – Alex

    26. November 2010 um 4:11 Uhr


Sie können diese Funktion verwenden (funktioniert in PHP Version >= 5.3):

function sortArrayByKey(&$array,$key,$string = false,$asc = true){
    if($string){
        usort($array,function ($a, $b) use(&$key,&$asc)
        {
            if($asc)    return strcmp(strtolower($a{$key}), strtolower($b{$key}));
            else        return strcmp(strtolower($b{$key}), strtolower($a{$key}));
        });
    }else{
        usort($array,function ($a, $b) use(&$key,&$asc)
        {
            if($a[$key] == $b{$key}){return 0;}
            if($asc) return ($a{$key} < $b{$key}) ? -1 : 1;
            else     return ($a{$key} > $b{$key}) ? -1 : 1;

        });
    }
}

Beispiel:

sortArrayByKey($yourArray,"name",true); //String sort (ascending order)
sortArrayByKey($yourArray,"name",true,false); //String sort (descending order)
sortArrayByKey($yourArray,"id"); //number sort (ascending order)
sortArrayByKey($yourArray,"count",false,false); //number sort (descending order)

  • Tatsächlich $result wird beinhalten TRUE wenn es erfolgreich ist, und Ihr Vergleich sollte sein $a->name > $b->name. 🙂

    – cambraka

    26. November 2010 um 3:56 Uhr

  • @cambraca: oh, vergessen, dass es Arrays als Referenz akzeptiert. Übrigens hat OP nicht gesagt, in welcher Reihenfolge er die Sammlung sortieren muss.

    – zerkms

    26. November 2010 um 3:57 Uhr

  • Nun ja, es ist eine Datenbank 🙂 eigentlich von einer Funktion, die die Daten aus der Datenbank erhält

    – Alex

    26. November 2010 um 4:01 Uhr


  • @Alex: warum sortierst du es dann nicht in der Datenbank? ORDER BY count

    – zerkms

    26. November 2010 um 4:02 Uhr

  • Es ist komplizierter, weil dies eine Standardfunktion von WordPress ist und ich beim Schreiben eines Plugins keine WP-Dateien ändern kann. Ich habe Ihr Beispiel mit create_function ausprobiert (weil ich es in einer Klasse verwende und nicht weiß, wie ich den Funktionsnamen an usort übergeben soll): create_function('$a,$b', "return $a->count < $b->count;") aber ich kann es nicht zum Laufen bringen 🙁 Ich bekomme ein paar Hinweise und Warnungen, dass usort erwartet, dass Parameter 2 ein gültiger Rückruf ist

    – Alex

    26. November 2010 um 4:11 Uhr


Wenn alles fehlschlägt, ist hier eine andere Lösung:

$names = array(); 
foreach ($my_array as $my_object) {
    $names[] = $my_object->name; //any object field
}

array_multisort($names, SORT_ASC, $my_array);

return $my_array;

  • Für diese Lösung sollten Sie einen Oscar bekommen! ))))) Danke

    – Imeksbank

    25. Juli 2019 um 17:11 Uhr

989670cookie-checkArray von Objekten nach Objektfeldern sortieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy