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%)
-----


Uzależnienie od kolejności wykonywania tych metod jest moim zdaniem bardzo problemogenne. Ale jeśli chcesz to robić w ten sposób to faktycznie najrozsądniej by było żeby ta tablica już istaniała z predefiniowanymi kluczami, ewentualnie inna tablica pomocnicza z kluczami, która byłaby wykorzystywana przy sortowaniu.

  1. $elements = array(
  2. 'select' => 'count(*) as total',
  3. 'type' => 'select',
  4. 'from' => array(
  5. 0 => array(
  6. 'name' => 'gallery'
  7. )
  8. ),
  9. 'where' => array(
  10. 0 => array(
  11. 'column' => 'cat',
  12. 'type' => '',
  13. 'bind' => 'cat'
  14. )
  15.  
  16. )
  17. );
  18.  
  19. function cmp($a, $b)
  20. {
  21. $order = array(
  22. 'type' => 0,
  23. 'select' => 1,
  24. 'from' => 2,
  25. 'where' => 3
  26. );
  27. return $order[$a] > $order[$b];
  28. }
  29.  
  30.  
  31. $sorting = uksort($elements, 'cmp');


Ten post edytował qrzysztof 3.04.2012, 14:55:35
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: 15.10.2025 - 06:53