Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Sortowanie elementów tablicy według określonej kolejności dla danego klucza
by_ikar
post
Post #1





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Witam, mam pewien problem. Wytłumaczę go na zasadzie query buildera, żeby było bardziej jasne o co mi chodzi. Taki query builder dobrze jakby obsługiwał method chining, tak też można wtedy przykładowo użyć najpierw where, później select, a gdzieś na końcu from. Ogólnie można pomieszać kolejność. Załóżmy, że każde wywołanie jakiejś metody typu where, select, from itp dodaje do jednej większej tablicy swój klucz wraz z odpowiednimi wartościami. Jeżeli ktoś wie jak działa Zend_Db_Select, to mniej więcej zrozumie o co mi chodzi. I teraz w przypadku takiego buildera, na samym końcu wywołujemy jakąś metodę, która całość naszego zapytania skleja. W Zend_Db_Select, jest to foreach, który przelatuje po tablicy i dla odpowiednich kluczy wywołuje odpowiednie metody, które z tablicy pobierają dane i tworzą zapytanie.

Problem jaki ja mam, jest co w przypadku użycia innej kolejności? Powiedzmy użyjemy naszego buildera w taki sposób:

  1. $database->where($criteria)->offset(0)->select('*')->from('table')->get();


Jest to jak widać dość nietypowa konstrukcja zapytania, i można nawet przypadkiem, aczkolwiek nie tak jak w przykładzie, ale można zamienić kolejność niektórych rzeczy. Przykładowo użyć where za order i wtedy będziemy mieli niepoprawne zapytanie (w przypadku Zend_Db_Select jest to metoda assemble, która skleja sobie zapytanie).

Pomysłem na rozwiązanie mogłoby być posortowanie tablicy, za pomocą chociażby uksort, wraz z funkcją zwrotną. Teraz tylko pytanie, w jaki sposób określić konkretną kolejność dla konkretnych elementów, bo zapytanie może być różne, możemy użyć order, a nie musimy, to samo tyczy się where, limit, offset, group, union i tym podobnych. Pomyślałem że mogę w funkcji zwrotnej dla uksort, stworzyć kolejną tablicę, i do tej tablicy wrzucać elementy w określonej kolejności i dopiero ją zwrócić. Tylko mam właśnie problem, z wymyśleniem tego, w jaki sposób dana pętla miałaby wiedzieć ile tych elementów już jest w tablicy, oraz na jakie miejsce wstawić dany element..

Drugim pomysłem jest już podczas tworzenia zapytania, czyli podczas wywołania jakiejś metody, przykładowo where, już wtedy dodawana do tablicy jest wraz z swoją kolejnością. Aczkolwiek trzeba by trochę takiego buildera przebudować, i lepszą opcją byłoby sortowanie tuż przed sklejeniem zapytania..

Za wszelkie sugestie z góry dziękuje. Jeżeli napisałem coś nie jasno, to śmiało proszę pisać, z chęcią spróbuje to w jakiś inny bardziej zrozumiały sposób opisać.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
qrzysztof
post
Post #2





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

Ostrzeżenie: (0%)
-----


Podaj przykład bo nie do końca rozumiem skąd biorą się te problemy z kolejnością. Ja mam WHERE w $this->_where, a ORDER w $this->_order. I metoda budująca zapytanie sprawdzi sobie w odpowiednim miejscu czy zostało określone WHERE i ORDER i wstawi sobie to do zapytania, niezależnie od tego czy użytkownik wywołał:
  1. $db->select('*')->from('t_zamowienia')->where('id>%s', 100)->order('data DESC')->execute();


czy

  1. $db->select('*')->from('t_zamowienia')->order('data DESC')->where('id>%s', 100)->execute();


O taką koleność tu chodzi czy jeszcze o coś innego?

Ten post edytował qrzysztof 3.04.2012, 13:16:58
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 10.10.2025 - 22:57