it-swarm.com.de

Sortiere Array von Objekten nach Objektfeldern

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

   ....
444
Alex

Verwenden Sie usort , hier ein aus dem Handbuch angepasstes Beispiel:

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

usort($your_data, "cmp");

aus Kommentaren importierte Bearbeitungen:

Wenn Sie das Array innerhalb der Klasse sortieren und Ihre Sortierungsfunktion cmp auch innerhalb der Klasse definiert ist, verwenden Sie Folgendes:

usort($your_data, array($this, "cmp"))
584
cambraca

Hier ist ein schöner Weg mit Verschlüssen

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

Bitte beachten Sie, dass dies nicht in der Dokumentation von PHP enthalten ist. Wenn Sie jedoch 5.3 oder höher verwenden, werden Verschlüsse unterstützt, bei denen aufrufbare Argumente angegeben werden können.

428
Scott Quinlan

wenn Sie PHP oop verwenden, müssen Sie möglicherweise Folgendes ä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')); 
39
Doron Segal

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 dasselbe Register (obere oder untere)

// 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);
});
31
Roman Yakoviv
usort($array, 'my_sort_function');

var_dump($array);

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

Derselbe Code wird mit dem Feld count angegeben.

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

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

25
zerkms

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)
8
PoengAlex

Sie können usort wie folgt verwenden:

usort($array,function($first,$second){
    return strcmp($first->name, $second->name);
});
3
Luca C.

Wenn hier alles schief geht, gibt es 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;
2
Adrian P.

Der Nachteil aller Antworten hier ist, dass sie static Feldnamen verwenden, also habe ich eine angepasste Version im Stil OOP geschrieben. Angenommen, Sie verwenden Getter-Methoden, Sie könnten diese Klasse direkt verwenden und denFeldnamen als Parameter verwenden. Wahrscheinlich findet es jemand nützlich.

class CustomSort{

    public $field = '';

    public function cmp($a, $b)
    {
        /**
         * field for order is in a class variable $field
         * using getter function with naming convention getVariable() we set first letter to uppercase
         * we use variable variable names - $a->{'varName'} would directly access a field
         */
        return strcmp($a->{'get'.ucfirst($this->field)}(), $b->{'get'.ucfirst($this->field)}());
    }

    public function sortObjectArrayByField($array, $field)
    {
        $this->field = $field;
        usort($array, array("Your\Namespace\CustomSort", "cmp"));;
        return $array;
    }
} 
2
Horst Jahns

Eine einfache Alternative, mit der Sie dynamisch das Feld bestimmen können, auf dem die Sortierung basiert:

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

Dies basiert auf der Closure-Klasse , die anonyme Funktionen erlaubt. Es ist seit PHP 5.3 verfügbar.

1
clami219

Vielen Dank für die Inspiration, ich musste auch einen externen $ translator-Parameter hinzufügen

usort($listable_products, function($a, $b) {
    global $translator;
    return strcmp($a->getFullTitle($translator), $b->getFullTitle($translator));
});
1
michalzuber

Wenn Sie einen String-Vergleich auf lokaler Basis benötigen, können Sie anstelle von strcollstrcmp verwenden.

Denken Sie daran, zuerst setlocale mit LC_COLLATE zu verwenden, um ggf. Informationen zum Gebietsschema festzulegen.

  usort($your_data,function($a,$b){
    setlocale (LC_COLLATE, 'pl_PL.UTF-8'); // Example of Polish language collation
    return strcoll($a->name,$b->name);
  });
1
Wilq

Wenn Sie dies in Codeigniter verwenden, können Sie die folgenden Methoden verwenden:

usort($jobs, array($this->job_model, "sortJobs"));  // function inside Model
usort($jobs, array($this, "sortJobs")); // Written inside Controller.

@rmooney danke für den Vorschlag. Es hilft mir wirklich.

1
PHP Developer

Das ist was ich für eine Nutzerklasse habe

class Util
{
    public static function sortArrayByName(&$arrayToSort, $meta) {
        usort($arrayToSort, function($a, $b) use ($meta) {
            return strcmp($a[$meta], $b[$meta]);
        });
    }
}

Nennen:

Util::sortArrayByName($array, "array_property_name");
0
Demodave

Wenn Sie nur nach einem Feld sortieren müssen, ist usort eine gute Wahl. Die Lösung wird jedoch schnell unübersichtlich, wenn Sie nach mehreren Feldern sortieren müssen. In diesem Fall kann YaLinqo library * verwendet werden, wodurch eine SQL-ähnliche Abfragesyntax für Arrays und Objekte implementiert wird. Es hat eine schöne Syntax für alle Fälle:

$sortedByName         = from($objects)->orderBy('$v->name');
$sortedByCount        = from($objects)->orderBy('$v->count');
$sortedByCountAndName = from($objects)->orderBy('$v->count')->thenBy('$v->name');

Hier ist '$v->count' eine Abkürzung für function ($v) { return $v->count; } (beide können verwendet werden). Diese Methodenketten geben Iteratoren zurück. Sie können jedoch Arrays erhalten, indem Sie am Ende ->toArray() hinzufügen, wenn Sie es benötigen.

* von mir entwickelt

0
Athari

der beste einfache Weg ist

return array_values(array_sort($array, function ($value) {
  return $value->key;
}));

Ersetzen Sie den Schlüssel durch den 'Schlüssel', den Sie bestellen möchten

0
Diego Salguero

wenn Sie Termine sortieren möchten

   usort($threads,function($first,$second){
        return strtotime($first->dateandtime) < strtotime($second->dateandtime);
    });
0

Sie können sortierte Funktion von Nspl verwenden:

use function \nspl\a\sorted;
use function \nspl\op\propertyGetter;
use function \nspl\op\methodCaller;

// Sort by property value
$sortedByCount = sorted($objects, propertyGetter('count'));

// Or sort by result of method call
$sortedByName = sorted($objects, methodCaller('getName'));
0

Sie können usort wie folgt verwenden

Wenn Sie nach Nummer sortieren möchten:

function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");

oder Abc char:

function cmp($a, $b)
{
    return strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";

usort($fruits, "cmp");

Weitere Informationen: https://www.php.net/manual/en/function.usort.php

0
Alex