Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sortowanie tablicy
Forum PHP.pl > Forum > Przedszkole
Bojakki
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
altruista2
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
Bojakki
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
altruista2
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...
Bojakki
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)
altruista2
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
Bojakki
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!
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.