Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Sortowanie tablicy
Bojakki
post 17.02.2010, 19:37:43
Post #1





Grupa: Zarejestrowani
Postów: 379
Pomógł: 0
Dołączył: 18.08.2004

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


Mam kod:
  1. $sz1 = '52.25'; $wy1 = '20.99';
  2. $query = mysql_query("SELECT id, sz, wy FROM obiekty WHERE id<6 ") or die(mysql_error());
  3. while($row = mysql_fetch_row($query))
  4. {
  5. $id = $row[0];
  6. $sz2 = $row[1];
  7. $wy2 = $row[2];
  8. $odleglosc = rad2deg(acos(sin(deg2rad($sz1)) * sin(deg2rad($sz2)) + cos(deg2rad($sz1)) * cos(deg2rad($sz2)) * cos(deg2rad($wy1-$wy2)))) * 111.18957696;
  9. echo $id.'-'.$odleglosc.'<br />';
  10. $dane[] = array('odleglosc' => $odleglosc, 'id' => $row[0]);
  11. }
  12.  
  13. foreach ($dane as $klucz => $wiersz) {
  14. $id[$klucz] = $wiersz['id'];
  15. $odleglosc[$klucz] = $wiersz['odleglosc'];
  16. }
  17.  
  18. array_multisort($odleglosc, SORT_ASC, $dane);
  19. foreach ($dane as $pk) {
  20. echo ''.$pk['id'].'-'.$pk['odleglosc'].'<br />';
  21. }


I otrzymuje az 2 bledy:

Kod
1-2.2237915397577
2-2.315200168564
3-1.6985289552447
4-2.1451081985803
5-2.0094442867764

Warning: Cannot use a scalar value as an array in /home/urbanity/ftp/test8.php on line 18

Warning: Cannot use a scalar value as an array in /home/urbanity/ftp/test8.php on line 18

Warning: Cannot use a scalar value as an array in /home/urbanity/ftp/test8.php on line 18

Warning: Cannot use a scalar value as an array in /home/urbanity/ftp/test8.php on line 18

Warning: Cannot use a scalar value as an array in /home/urbanity/ftp/test8.php on line 18

Warning: array_multisort() [function.array-multisort]: Argument #1 is expected to be an array or a sort flag in /home/urbanity/ftp/test8.php on line 21
1-2.2237915397577
2-2.315200168564
3-1.6985289552447
4-2.1451081985803
5-2.0094442867764


Czyli wszytsko jest dobrze do momentu wrzucenia danych do tablicy i ich posortowania. Co ciekawe, jak napisze sobie sam tablice:
Kod
$dane[] = array('odleglosc' => '2.2237915397577', 'id' => 1);
$dane[] = array('odleglosc' => '2.315200168564', 'id' => 2);
$dane[] = array('odleglosc' => '1.6985289552447', 'id' => 3);


to działa sortowanie normalnie


--------------------
Go to the top of the page
+Quote Post
altruista2
post 17.02.2010, 19:41:24
Post #2





Grupa: Zarejestrowani
Postów: 127
Pomógł: 32
Dołączył: 8.02.2010

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


Użyj funkcji którą kiedyś znalazłem w sieci:
  1. class myutil {
  2. static private $sortfield = null;
  3. static private $sortorder = 1;
  4. static private function sort_callback(&$a, &$b) {
  5. if($a[self::$sortfield] == $b[self::$sortfield]) return 0;
  6. return ($a[self::$sortfield] < $b[self::$sortfield])? -self::$sortorder : self::$sortorder;
  7. }
  8. static function sort(&$v, $field, $asc=true) {
  9. self::$sortfield = $field;
  10. self::$sortorder = $asc? 1 : -1;
  11. usort($v, array('myutil', 'sort_callback'));
  12. }
  13. }


I tablicę dane możesz sortować w ten sposób:
  1. myutil::sort($dane, 'odleglosc');


Prosto i efektywnie smile.gif Niestety działa od PHP 5 wzwyż.

P.S.
http://www.urbanity.pl/test8.php
biggrin.gif

Ten post edytował altruista2 17.02.2010, 19:42:58


--------------------
Jeśli Ci pomogłem kliknij pomógł. W ten sposób temat zaświeci się na żółto i użytkownicy którzy pomagają nie będą musieli niepotrzebnie klikać. Dziękuję.

"Pomaganie"
Go to the top of the page
+Quote Post
Bojakki
post 17.02.2010, 19:47:31
Post #3





Grupa: Zarejestrowani
Postów: 379
Pomógł: 0
Dołączył: 18.08.2004

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


Dobrze sortuje, ale nadal wyskakuje jakis blad:
Kod
1-2.2237915397577
2-2.315200168564
3-1.6985289552447
4-2.1451081985803
5-2.0094442867764

Warning: array_multisort() [function.array-multisort]: Argument #1 is expected to be an array or a sort flag in /home/urbanity/ftp/test8.php on line 32
3-1.6985289552447
5-2.0094442867764
4-2.1451081985803
1-2.2237915397577
2-2.315200168564


--------------------
Go to the top of the page
+Quote Post
altruista2
post 17.02.2010, 19:49:33
Post #4





Grupa: Zarejestrowani
Postów: 127
Pomógł: 32
Dołączył: 8.02.2010

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


Bo zostawiłeś gdzieś array-multisort w skrypcie (wywal to skoro "moja" funkcja dobrze działa)

Całe to:
  1. foreach ($dane as $klucz => $wiersz) {
  2. $id[$klucz] = $wiersz['id'];
  3. $odleglosc[$klucz] = $wiersz['odleglosc'];
  4. }
  5.  
  6. array_multisort($odleglosc, SORT_ASC, $dane);
  7. foreach ($dane as $pk) {
  8. echo ''.$pk['id'].'-'.$pk['odleglosc'].'<br />';
  9. }

nie jest już potrzebne...

Ten post edytował altruista2 17.02.2010, 19:50:26


--------------------
Jeśli Ci pomogłem kliknij pomógł. W ten sposób temat zaświeci się na żółto i użytkownicy którzy pomagają nie będą musieli niepotrzebnie klikać. Dziękuję.

"Pomaganie"
Go to the top of the page
+Quote Post
Bojakki
post 17.02.2010, 19:55:44
Post #5





Grupa: Zarejestrowani
Postów: 379
Pomógł: 0
Dołączył: 18.08.2004

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


Teraz jest OK.

Mam taki wynik:

Kod
3-1.6985289552447
5-2.0094442867764
4-2.1451081985803
1-2.2237915397577
2-2.315200168564


Jeszcze tylko lamerskie pytanko

chce przypisac zmiennej
$id to co jest w pierwszym wierszu przed myslnikiem (3) i zmiennej $odleglosc to co jest w pierwszym rzedzie po myslniku (1.6985289552447)


--------------------
Go to the top of the page
+Quote Post
altruista2
post 17.02.2010, 20:26:15
Post #6





Grupa: Zarejestrowani
Postów: 127
Pomógł: 32
Dołączył: 8.02.2010

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


To całkiem proste? biggrin.gif
  1. $id = $dane[0]['id'];
  2. $odleglosc = $dane[0]['odleglosc'];


Btw. widzę uparłeś się przy tej swojej metodzie
Temat: MySQLSQLPHP Znajdowanie najblizszych obiektow wedug wspolrzednych

Przy > 3 000 wierszy będziesz żałował tego sad.gif Bo przy każdym dodaniu obiektu będziesz musiał sortować cała tablicę... Pomyśl milionie wierszy ohmy.gif

Znając życie zrobisz UPDATE wiersz SET najblizszy=$id. Najlepsze jest to że ten cały twój skrypt (tak, zapisywanie do tablicy najbliższego obiektu) można byłoby zagnieźcić do 1. zapytania SQL biggrin.gif

Ten post edytował altruista2 17.02.2010, 20:32:37


--------------------
Jeśli Ci pomogłem kliknij pomógł. W ten sposób temat zaświeci się na żółto i użytkownicy którzy pomagają nie będą musieli niepotrzebnie klikać. Dziękuję.

"Pomaganie"
Go to the top of the page
+Quote Post
Bojakki
post 17.02.2010, 21:12:46
Post #7





Grupa: Zarejestrowani
Postów: 379
Pomógł: 0
Dołączył: 18.08.2004

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


Nie będzie tzreba za każdy nowym rekordem aktualziować wszystkich pozostałych rekordow gdyż jeżeli nawet będę aktualizował najblizszy obiekt raz na 2-3 miesiace to funkcjonalnsc sewisu duzo na tym nie straci. Poza tym baza ma obecnie 5 tys obiektow i w ciagu najblizszych 2 lat nie przekroczy raczej 12-14 tys. Wiec luz:)

Aczkolwiek dostrzegam równiez plusy Twojego roziwązania:)

Dzieki za pomoc!


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.07.2025 - 01:06