Code42 > PHP > Sortowanie obiektów po dacie utworzenia

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że 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, a ponad to 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'))

Podobne wpisy:

  1. Symfony+Propel: domyślne sortowanie
  2. Walidacja jednego pola formularza w symfony
  3. Epic: ALERT w PHP i niespodziewane białe ekrany śmierci
Kategorie:PHP Tagi:,
  1. Luty 23rd, 2009 at 10:41 | #1

    A w Rubym/Rails:

    images_and_videos.sort { |a, b| a.created_at <=> b.created_at }
  1. Brak jeszcze trackbacków