Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] sortowanie danych w tablicy
Forum PHP.pl > Forum > Przedszkole
koszal
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"
kornel-php
asort" title="Zobacz w manualu PHP" target="_manual lub jakaś podobna
koszal
ale jak to zastosować od tablicy wielowymiarowej i do konkretnych jej elementów? Prosiłbym o przykład
kornel-php
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
tommy4
http://pl.php.net/manual/en/function.array-multisort.php

przy odrobinie szczęścia zrozumiesz o co chodzi;]
koszal
No dobra, dzięki Wam wielkie, łapie sie za słownik i powoli może dojde jak to sie robi ;P
Hazel
Zawsze można użyć usort() i zdefiniować własną funkcję porównująca, często tak jest łatwiej winksmiley.jpg
koszal
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
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.