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
)
....
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"))
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.
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'));
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);
});
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?
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)
Sie können usort
wie folgt verwenden:
usort($array,function($first,$second){
return strcmp($first->name, $second->name);
});
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;
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;
}
}
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.
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));
});
Wenn Sie einen String-Vergleich auf lokaler Basis benötigen, können Sie anstelle von strcoll
strcmp
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);
});
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.
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");
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
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
wenn Sie Termine sortieren möchten
usort($threads,function($first,$second){
return strtotime($first->dateandtime) < strtotime($second->dateandtime);
});
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'));
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