Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie tablicy
Forum PHP.pl > Forum > PHP
adiq
Witam,
mam dane wyciągane do tablicy podanej poniżej.
  1. (
  2. [0] => Array
  3. (
  4. [id] => 1
  5. [typ] => recenzja
  6. [catid] => 1
  7. [userid] => 1
  8. [addtime] => 124314132
  9. [views] => 4
  10. [title] => tytul
  11. [shortcontent] => krotki kontent
  12. [content] => cala tresc
  13. )
  14.  
  15. [1] => Array
  16. (
  17. [id] => 3
  18. [typ] => recenzja
  19. [catid] => 1
  20. [userid] => 1
  21. [addtime] => 41231231
  22. [views] => 5
  23. [title] => title
  24. [shortcontent] => abc..
  25. [content] => asdfghjkl
  26. )
  27. )



Musze posortować tablice według wartości 'addtime' od największej.

Całość (już posortowaną) muszę prze konwertować do obiektu, jak zrobić to w prosty sposób.
Wartości takie same tzn. $a[0][catid] ma się dać wywołać przez $obj[0]->catid .

Pozdrawiam i prosze o odpowiedź smile.gif
tehaha
a skąd bierzesz te dane? bo jeśli pobierasz je z bazy danych to najlepiej pobrać już posortowane, natomiast jeżeli nie masz takiej możliwości to może wypróbuj to rozwiązanie http://www.phpfreaks.com/forums/index.php?topic=209483.0 z uasort()
nmts
Może tak:

Kod
foreach ($tablica as $key => $row) {
    $addtime[$key]  = $row['addtime'];
}

array_multisort($addtime, SORT_DESC, $nowa_tablica);



yevaud
co to sortowania http://www.php.net/manual/en/array.sorting.php, potrzebujesz jakiegos user defined sort, prawdopodobnie uasort

a jesli chodzi o konwersje do obiektu to musisz zdefiniowac sobie klasy ktore odpowiednio opakuja ta tablice. Moze Ci sie przydac __set() i __get()
jajcarzd1
Do sortowania użyj funkcji array_multisort bo sam jej używam a jeśli chodzi o obiekty to możesz zrobić tak

  1.  
  2. $objArray = array();
  3.  
  4. foreach ($result as $item) {
  5.  
  6. $object = new stdClass();
  7.  
  8. $object->id = $item['id'];
  9. $object->typ = $item['typ'];
  10.  
  11. .....
  12. .....
  13.  
  14. $objArray[] = $object;
  15. }
  16.  
  17.  
adiq
Wielkie dzięki, teraz nie powinno być problemu smile.gif
Niestety nie moge sortować wyciągając z bazy, bo dane są z 2 tabel i wywala errora.

I mam jeszcze jedno pytanie.

Czy można w podobny sposób posortować dane w obiekcie ?
Struktura jest taka sama.

tehaha
to pokaż jakim zapytaniem to wyciągasz, bo jak tylko z 2 tabel, to nie powinno być problemu żeby pobrać od razu posortowane, było by to najwydajniejsze zwłaszcza przy większej ilości danych
adiq
Cytat(tehaha @ 18.06.2010, 11:44:36 ) *
jakim zapytaniem to wyciągasz


Zwykłe:
  1. SELECT * FROM news, recenzje ORDER BY addtime DESC LIMIT 10
jajcarzd1
Cytat(adiq @ 18.06.2010, 11:48:25 ) *
Zwykłe:
  1. SELECT * FROM news, recenzje ORDER BY addtime DESC LIMIT 10


Pokaż tego errora. Po drugie tworzysz tu iloczyn kartezjański obu tabel, nie mają one żadnych elementów wspólnych ?
adiq
Error nie z PHP, a z kohany.
Tabela news jak i recenzje są identyczne.
  1. Column 'addtime' in order clause is ambiguous.
darko
Cytat(adiq @ 18.06.2010, 11:59:08 ) *
Error nie z PHP, a z kohany.
Tabela news jak i recenzje są identyczne.
  1. Column 'addtime' in order clause is ambiguous.

Wynika z tego, że kolumna addtime występuje w obydwu tabelach i baza "nie wie" o którą tabelę chodzi. Rozwiązanie: użyj aliasów:
- dla addtime z tabeli news:
  1. SELECT * FROM news n, recenzje r ORDER BY n.addtime DESC LIMIT 10

- dla addtime z tabeli recenzje:
  1. SELECT * FROM news n, recenzje r ORDER BY r.addtime DESC LIMIT 10

Powinno zadziałać.
// edit
a gdzie tu masz warunek łączenia tabel lub zależność opartą o klucze obce? Mam na myśli to:

  1. SELECT * FROM news n, recenzje r WHERE n.FK_TABELI_RECENZJE=r.PK_TABELI ORDER BY r.addtime DESC LIMIT 10

*) gdzie FK_TABELI to klucz obcy, a PK_TABELI to klucz główny odpowiedniej tabeli.
jajcarzd1
Cytat(adiq @ 18.06.2010, 11:59:08 ) *
Error nie z PHP, a z kohany.
Tabela news jak i recenzje są identyczne.
  1. Column 'addtime' in order clause is ambiguous.


Zrób tak jak darko pisał dodaj aliasy i zób jakiegoś joina po wspólnej kolumnie, poza tym co za sens tworzyć 2 identyczne tabele i patrząc po nazwach takie kóre niby przechowują inne dane ?

A najlepiej to może pokaż strukturę obu tabel i powiedz co chcesz wyciągać
adiq
Wszystko super tylko dane i tak będe miał zwrócone do 2 obiektów które będą posortowane.
Gdy wrzucę je do 1 tabeli będzie to znów nie posortowane.

Muszę mieć jedno zapytanie które zwróci obiekt z danymi z obu tabel już posortowane,bo sortowanie każdej tablicy osobno nic nie da.

Poza tym klucz obcy nic nie da bo miedzy jedna a druga tabela nie ma zależności.
jajcarzd1
No to kolego użyj UNION ALL w zapytaniu dzięki któremu połączysz wyniki zapytania obu tabel i na końcu daj order by http://dev.mysql.com/doc/refman/5.0/en/union.html

Coś w stylu

  1. (SELECT * FROM news)
  2. UNION ALL
  3. (SELECT * FROM recenzje)
  4. ORDER BY addtime



Powinno działać
adiq
Zrzuciłem do 1 tabeli i po po kłopocie smile.gif

Ale dzięki, przyda mi się to później.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.