Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] sortowanie danych w tablicy
koszal
post 24.08.2007, 20:52:57
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 30.04.2007

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


Mam tablicę w takiej postaci:

  1. <?php
  2. $players[] = array(
  3. 'id' => $row['player_id'],
  4. 'name' => $row['player_name'],
  5. 'team' => $team['team_name'],
  6. 'goals' => $goals,
  7. 'goals_in' => $goals_in,
  8. 'goals_out' => $goals_out,
  9. 'points' => $points,
  10. );
  11. ?>


Posiada ona kilkanaście wierszy z danymi graczy, zdobytymi bramkami, punktami... Tu nasuwa się moje pytanie: jak zrobić w php, żeby posortować wiersze w malejącej kolejności odpowiednio wg liczby punktów, bilansu bramek, bramek zdobytych? Chodzi mi o to, żeby uzyskać taki efekt jak w mysql przy użyciu: "... ORDER BY points, goals, goals_in"
Go to the top of the page
+Quote Post
kornel-php
post 24.08.2007, 21:01:25
Post #2





Grupa: Zarejestrowani
Postów: 210
Pomógł: 20
Dołączył: 7.07.2006
Skąd: Krotoszyn

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


asort" title="Zobacz w manualu PHP" target="_manual lub jakaś podobna


--------------------
:)
Go to the top of the page
+Quote Post
koszal
post 24.08.2007, 21:06:34
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 30.04.2007

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


ale jak to zastosować od tablicy wielowymiarowej i do konkretnych jej elementów? Prosiłbym o przykład

Ten post edytował koszal 24.08.2007, 21:07:26
Go to the top of the page
+Quote Post
kornel-php
post 24.08.2007, 21:13:38
Post #4





Grupa: Zarejestrowani
Postów: 210
Pomógł: 20
Dołączył: 7.07.2006
Skąd: Krotoszyn

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


Jeśli chodzi o tablice wielowymiarową...

Za pomocą wyszukiwarki na forum znalazłem ciekawy temat dotyczący sortowania tablic wielowymiarowych:
http://forum.php.pl/index.php?showtopic=20...rt=#entry125185

Mam nadzieję, że to choć trochę pomoże

Ten post edytował kornel-php 24.08.2007, 21:17:24


--------------------
:)
Go to the top of the page
+Quote Post
tommy4
post 24.08.2007, 21:15:05
Post #5





Grupa: Zarejestrowani
Postów: 288
Pomógł: 12
Dołączył: 2.12.2005

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


http://pl.php.net/manual/en/function.array-multisort.php

przy odrobinie szczęścia zrozumiesz o co chodzi;]

Ten post edytował tommy4 24.08.2007, 21:16:23
Go to the top of the page
+Quote Post
koszal
post 24.08.2007, 21:21:21
Post #6





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 30.04.2007

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


No dobra, dzięki Wam wielkie, łapie sie za słownik i powoli może dojde jak to sie robi ;P
Go to the top of the page
+Quote Post
Hazel
post 25.08.2007, 10:42:47
Post #7





Grupa: Zarejestrowani
Postów: 492
Pomógł: 33
Dołączył: 16.08.2007
Skąd: Wrocław

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


Zawsze można użyć usort() i zdefiniować własną funkcję porównująca, często tak jest łatwiej winksmiley.jpg


--------------------
Go to the top of the page
+Quote Post
koszal
post 25.08.2007, 17:54:48
Post #8





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 30.04.2007

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


Udało mi się posortować tablicę, ale nie tą co chciałem. W tej, na której mi zależy wciąz wyskakuje błąd, którego nie potrafię wyeliminować:

Kod
Warning: Cannot use a scalar value as an array in D:\PHP\tabelka\test2.php on line 57

Warning: Cannot use a scalar value as an array in D:\PHP\tabelka\test2.php on line 58

Warning: Cannot use a scalar value as an array in D:\PHP\tabelka\test2.php on line 59

Warning: Cannot use a scalar value as an array in D:\PHP\tabelka\test2.php on line 57

Warning: Cannot use a scalar value as an array in D:\PHP\tabelka\test2.php on line 58

Warning: Cannot use a scalar value as an array in D:\PHP\tabelka\test2.php on line 59

Warning: Cannot use a scalar value as an array in D:\PHP\tabelka\test2.php on line 57

Warning: Cannot use a scalar value as an array in D:\PHP\tabelka\test2.php on line 58

Warning: Cannot use a scalar value as an array in D:\PHP\tabelka\test2.php on line 59

Warning: Cannot use a scalar value as an array in D:\PHP\tabelka\test2.php on line 57

Warning: Cannot use a scalar value as an array in D:\PHP\tabelka\test2.php on line 58

Warning: Cannot use a scalar value as an array in D:\PHP\tabelka\test2.php on line 59

Warning: array_multisort() [function.array-multisort]: Argument #1 is expected to be an array or sorting flag that has not already been specified in D:\PHP\tabelka\test2.php on line 65


Kod mojego skryptu:

  1. <?php
  2. require 'libs/Smarty.class.php';
  3. $smarty = new Smarty;
  4.  
  5. $connection = mysql_connect('localhost', 'root', '');
  6. mysql_select_db('turniej');
  7.  
  8. // pobieranie danych zawodników
  9. $result = mysql_query("SELECT * FROM players");
  10. while($row = mysql_fetch_array($result))
  11. {
  12. $team = mysql_fetch_assoc(mysql_query("SELECT * FROM teams WHERE team_id='".$row['team_id']."'"));
  13. // punkty
  14. $rank = mysql_query("SELECT * FROM matches WHERE home=".$row['player_id']."");
  15. while($goal = mysql_fetch_array($rank))
  16. {
  17. $goals = $goals + $goal['home_goals'] - $goal['away_goals'];
  18. $goals_in = $goals_in + $goal['home_goals'];
  19. $goals_out = $goals_out + $goal['away_goals'];
  20.  
  21. if($goal['home_goals'] > $goal['away_goals'])
  22. $points += 3;
  23. if($goal['home_goals'] == $goal['away_goals'])
  24. $points += 1;
  25. }
  26.  
  27. $rank = mysql_query("SELECT * FROM matches WHERE away=".$row['player_id']."");
  28. while($goal = mysql_fetch_array($rank))
  29. {
  30. $goals = $goals + $goal['away_goals'] - $goal['home_goals'];
  31. $goals_in = $goals_in + $goal['away_goals'];
  32. $goals_out = $goals_out + $goal['home_goals'];
  33.  
  34. if($goal['home_goals'] < $goal['away_goals'])
  35. $points += 3;
  36. if($goal['home_goals'] == $goal['away_goals'])
  37. $points += 1;
  38. }
  39.  
  40.  
  41.  
  42. $players[] = array(
  43. 'points' => $points,
  44. 'goals' => $goals,
  45. 'goals_in' => $goals_in,
  46. 'goals_out' => $goals_out,
  47. 'id' => $row['player_id'],
  48. 'name' => $row['player_name'],
  49. 'team' => $team['team_name'],
  50. );
  51.  
  52. $goals = 0;
  53. $goals_in = 0;
  54. $goals_out = 0;
  55. $points = 0;
  56. }
  57.  
  58. foreach ($players as $klucz => $wiersz) {
  59. $points[$klucz] = $wiersz['points'];
  60. $goals[$klucz] = $wiersz['goals'];
  61. $goals_in[$klucz] = $wiersz['goals_in'];
  62. }
  63.  
  64. array_multisort($points, SORT_DESC, $goals, SORT_DESC, $goals_in, SORT_DESC, $players);
  65.  
  66. $smarty->assign('players', $players);
  67.  
  68. $smarty->display('index.tpl');
  69. ?>



wydruk z nieposortowanej tablicy:
Kod
Array
(
    [0] => Array
        (
            [points] => 3
            [goals] => -1
            [goals_in] => 5
            [goals_out] => 6
            [id] => 1
            [name] => andrzej
            [team] => Manchester United FC
        )

    [1] => Array
        (
            [points] => 1
            [goals] => -4
            [goals_in] => 1
            [goals_out] => 5
            [id] => 2
            [name] => wojtek
            [team] => FC Barcelona
        )

    [2] => Array
        (
            [points] => 7
            [goals] => 4
            [goals_in] => 6
            [goals_out] => 2
            [id] => 3
            [name] => zbigniew
            [team] => Real Madrid
        )

    [3] => Array
        (
            [points] => 6
            [goals] => 1
            [goals_in] => 7
            [goals_out] => 6
            [id] => 4
            [name] => romek
            [team] => Inter
        )

)


Jak widać skrypt odpowiednio kompletuje dane, ale coś jest z nimi nie tak ;/

Może podam skrypt, który udało mi się stworzyć i działa bez zastrzeżen:

  1. <?php
  2.  
  3. $players[] = array('points' => 24, 'goals' => 5, 'goals_in' => 12, 'name' => 'andrzej');
  4. $players[] = array('points' => 21, 'goals' => 4, 'goals_in' => 5, 'name' => 'andrzej');
  5. $players[] = array('points' => 24, 'goals' => 2, 'goals_in' => 13, 'name' => 'andrzej');
  6. $players[] = array('points' => 44, 'goals' => 15, 'goals_in' => 24, 'name' => 'andrzej');
  7. $players[] = array('points' => 14, 'goals' => 1, 'goals_in' => 4, 'name' => 'andrzej');
  8. $players[] = array('points' => 16, 'goals' => -2, 'goals_in' => 11, 'name' => 'andrzej');
  9. $players[] = array('points' => 33, 'goals' => 11, 'goals_in' => 22, 'name' => 'andrzej');
  10.  
  11. foreach ($players as $klucz => $wiersz) {
  12. $points[$klucz] = $wiersz['points'];
  13. $goals[$klucz] = $wiersz['goals'];
  14. $goals_in[$klucz] = $wiersz['goals_in'];
  15. }
  16.  
  17. array_multisort($points, SORT_DESC, $goals, SORT_DESC, $goals_in, SORT_DESC, $players);
  18.  
  19. ?>
  20.  
  21. <pre>
  22. <?
  23. print_r($players);
  24. ?>
  25. </pre>




Osobiście nie widze różnicy między tymi skryptami, ale widocznie interpreter Php je zauważa winksmiley.jpg Byłbym wdzięczny za pomoc
PS. Jeśli popełniłem jakiś bardzo głupi błąd, to przepraszam, dopiero raczkuję w php

Ten post edytował koszal 25.08.2007, 17:58:00
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: 31.07.2025 - 10:49