Jak mogę posortować tę tablicę obiektów według jednego z jej pól, takich jak name
lub 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
)
....
Jest lepszy sposób przy użyciu zamknięć
Pamiętaj, że nie ma tego w dokumentacji PHP, ale jeśli używasz zamków w wersji 5.3+, obsługiwane są argumenty, które można wywoływać.
źródło
uasort()
-1 * strcmp($a->name, $b->name);
strcmp($b->name, $a->name)
usort
ale funkcja porównania jest taka sama. Korzystając z tego, powinieneś zduplikować kod zamknięcia zamiast wywoływaćprotected static
metodę, którą musisz zdefiniować tylko raz w klasie nadrzędnej.Jeśli chcesz posortować wartości całkowite:
ZAKTUALIZOWANO z ciągiem nie zapomnij przekonwertować na ten sam rejestr (górny lub dolny)
źródło
jeśli używasz php oop, być może będziesz musiał zmienić na:
źródło
Ten sam kod będzie z
count
polem.Więcej informacji na temat
usort
: http://ru2.php.net/usortPrzy okazji, skąd masz tę tablicę? Mam nadzieję, że nie z bazy danych?
źródło
$result
będzie zawierać,TRUE
jeśli się powiedzie, a twoje porównanie powinno być$a->name > $b->name
. :)ORDER BY count
create_function('$a,$b', "return $a->count < $b->count;")
ale nie mogę sprawić, by działała :( Otrzymuję kilka powiadomień i ostrzeżeń, że usort oczekuje, że parametr 2 będzie prawidłowym wywołaniem zwrotnymMożesz użyć tej funkcji (działa w wersji PHP> = 5.3):
Przykład:
źródło
$a->{$key}
a$b->{$key}
zamiast tego,$a[$key]
a$b[$key]
tak naprawdę, zajmując się właściwościami, a nie elementami tablicy, ale to wciąż była odpowiedź, której szukałem.Możesz użyć
usort
takiego:źródło
Jeśli wszystko się nie powiedzie, jest inne rozwiązanie:
źródło
Minusem wszystkich odpowiedzi tutaj jest to, że używają statycznych nazw pól, więc napisałem poprawioną wersję w stylu OOP. Zakładając, że używasz metod pobierających, możesz bezpośrednio użyć tej klasy i użyć nazwy pola jako parametru . Prawdopodobnie ktoś uzna to za przydatne.
źródło
jeśli chcesz posortować daty
źródło
Prosta alternatywa, która pozwala dynamicznie określić pole, na którym opiera się sortowanie:
Jest to oparte na klasie Closure , która umożliwia anonimowe funkcje. Jest dostępny od PHP 5.3.
źródło
Jeśli potrzebujesz lokalnego porównania ciągów, możesz użyć
strcoll
zamiaststrcmp
.Pamiętaj, aby po raz pierwszy użyć
setlocale
wLC_COLLATE
celu ustawienia informacji regionalnych w razie potrzeby.źródło
Jeśli używasz tego w Codeigniter, możesz użyć metod:
@rmooney dziękuję za sugestię. To naprawdę mi pomaga.
źródło
Dzięki za inspiracje musiałem również dodać zewnętrzny parametr $ translator
źródło
Jeśli chcesz sortować według tylko jednego pola,
usort
to dobry wybór. Jednak rozwiązanie szybko staje się niechlujne, jeśli trzeba sortować według wielu pól. W takim przypadku można użyć biblioteki YaLinqo *, która implementuje składnię zapytań podobną do SQL dla tablic i obiektów. Ma ładną składnię dla wszystkich przypadków:Tutaj
'$v->count'
jest skrótemfunction ($v) { return $v->count; }
(można użyć obu). Te łańcuchy metod zwracają iteratory, ale tablice można uzyskać, dodając->toArray()
w końcu, jeśli potrzebujesz.* opracowane przeze mnie
źródło
Możesz użyć posortowanej funkcji z Nspl :
źródło
To właśnie mam dla klasy użytkowej
Nazwać:
źródło
Możesz użyć usort w ten sposób
Jeśli chcesz sortować według numeru:
Lub znak ABC:
Zobacz więcej: https://www.php.net/manual/en/function.usort.php
źródło