PHP: Sortowanie obiektów po dacie utworzenia

Czasami istnieje potrzeba posortowania obiektów wg własnych kryteriów — dajmy na to w przypadku, gdy w jednej tablicy mamy obiekty różnych typów. Aby jednak sortowanie mogło mieć sens, potrzebne jest jakieś wspólne pole. W tym przykładzie chcemy sortować po dacie utworzenia, więc z założenia wynika, że obiekty będą miały pole created_at.
Do sortowania można wykorzystać funkcję usort:
bool usort ( array &$array , callback $cmp_function )
Jako argumenty przyjmuje ona tablicę i funkcję do porównywania (tzw. callback).
Funkcja porównująca przyjmuje za argumenty wartości do porównania (tutaj: obiekty) i zwraca -1, 0 lub 1 aby określić czy pierwsza wartość jest odpowiednio mniejsza, równa czy większa. W naszym przypadku znaki są zamienione by posortować „od najnowszego” oraz, dla uproszczenia, pomijamy zwracanie zera, ponieważ jego wystąpienie i tak jest mało prawdopodobne. Poza tym nie istnieje kolejne kryterium porównania, więc w przypadku takiej samej daty, kolejność dwóch obiektów jest dowolna:
public static function compare_by_date ($o1, $o2) { return ($o1->getCreatedAt ('U') <= $o2->getCreatedAt ('U')) ? +1 : -1; }
Metoda korzysta z dość typowego w aplikacjach Symfony (opartych na Propelu) gettera getCreatedAt, który przyjmuje format daty w takiej samej postaci jak funkcja PHP date. W tym przypadku jest to tzw. Unix epoch oznaczający liczbę sekund od początku roku 1970. A sekundy (czytaj: liczby całkowite) porównuje się już bez problemu.
Mając gotową taką funkcję (tutaj jako metoda klasy std) możemy posortować tablicę obiektów poprzez wykonanie:
usort ($images_and_videos, array ('std', 'compare_by_date'))
To dziwne wywołanie tablicowe jest konieczne, gdy korzystamy podać metodę jakiejś klasy. Zwykłą funkcję podajemy po prostu jako ciąg znaków.
Podobne wpisy:
- PHP: łączenie tablic na dwa sposoby
- Symfony+Propel: domyślne sortowanie
- Symfony: Paginacja przy własnych/nietypowych warunkach SQL
Autorzy zdjęć: junojp





A w Rubym/Rails: