Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z posortowaniem tabeli automatycznej
Forum PHP.pl > Forum > Przedszkole
Adzik1992
Witam, mam skrypt z przed kilku lat do prowadzenia lig, ogólnie to tabel. Kiedyś było wszystko ok, na serwerach ze starszym PHP sortowanie przebiega prawidłowo. Problem jest na serwerach z nowszym PHP. Pokazuje się błąd: Warning: usort() [function.usort]: Array was modified by the user comparison function. Bardzo proszę o pomoc, znam tylko podstawy PHP.


  1. for ($i=0; $i<=$amount_of_players; $i++)
  2. {
  3. $wo_for[$i] = explode ("\t" , $get_wo_for[$i]);
  4. $wo_against[$i] = explode ("\t" , $get_wo_against[$i]);
  5. }
  6. $get_withdraw = file("withdraw.txt");
  7. $withdraw = explode ("\t", $get_withdraw[0]);
  8. for ($i=0; $i<$amount_of_players; $i++)
  9. {
  10. $id[$i] = $i;
  11. $matches[$i] = 0;
  12. $points[$i] = 0;
  13. $wins[$i] = 0;
  14. $draws[$i] = 0;
  15. $losses[$i] = 0;
  16. $frameswon[$i] = 0;
  17. $frameslost[$i] = 0;
  18. $difference[$i] = 0;
  19. $proportion[$i] = 0;
  20. $wo[$i] = 0;
  21. $wo_wins[$i] = 0;
  22. $maxwins[$i] = 0;
  23. for ($m=0; $m<$amount_of_players; $m++)
  24. {
  25. for ($n=0; $n<$amount_of_players; $n++)
  26. {
  27. $match[$m][$n] = 0;
  28. }
  29. }
  30. for ($j=0; $j<$amount_of_players; $j++)
  31. {
  32. if ($for[$i][$j]+$against[$i][$j]>0 && $i!=$j)
  33. {
  34. if ($for[$i][$j]>$against[$i][$j])
  35. {
  36. $wins[$i]++;
  37. $match[$i][$j]=1;
  38. if($for[$i][$j]==3 && $against[$i][$j]==0)
  39. {
  40. $maxwins[$i]++;
  41. }
  42. }
  43. else
  44. {
  45. if ($for[$i][$j]<$against[$i][$j])
  46. {
  47. $losses[$i]++;
  48. $match[$i][$j]=-1;
  49. if($wo_against[$i][$j]!=0)
  50. {
  51. $wo[$i]++;
  52. }
  53. if($wo_for[$i][$j]!=0)
  54. {
  55. $wo_wins[$i]++;
  56. }
  57. }
  58. else
  59. {
  60. $draws[$i]++;
  61. $match[$i][$j]=0;
  62. }
  63. }
  64. $frameswon[$i] = $frameswon[$i] + $for[$i][$j];
  65. $frameslost[$i] = $frameslost[$i] + $against[$i][$j];
  66. }
  67. }
  68. $matches[$i] = $wins[$i] + $draws[$i] + $losses[$i];
  69. $points[$i] = $points_for_win * $wins[$i] + $points_for_draw * $draws[$i] + $points_for_loss * $losses[$i] - $drawback_wo_against * $wo[$i] - $drawback_wo_for * $wo_wins[$i];
  70. $difference[$i] = $frameswon[$i] - $frameslost[$i];
  71. if ($frameslost[$i]!=0)
  72. {
  73. $proportion[$i] = $frameswon[$i]/$frameslost[$i];
  74. }
  75. }
  76. for ($i=0; $i<$amount_of_players; $i++)
  77. {
  78. $playerstandings[$i] = array ( $nick[$i], $points[$i], $matches[$i], $wins[$i], $draws[$i], $losses[$i], $frameswon[$i], $frameslost[$i], $difference[$i], $proportion[$i], $maxwins[$i], $match[$i], $id[$i], $withdraw[$i] );
  79. }
  80. function sort_($x, $y)
  81. {
  82. global $playerstandings;
  83. global $match;
  84. global $for, $against;
  85. if ($x[13]>$y[13])
  86. {
  87. return 1;
  88. }
  89. else if ($x[13]<$y[13])
  90. {
  91. return -1;
  92. }
  93. else
  94. {
  95. if ($x[1]<$y[1])
  96. {
  97. return 1;
  98. }
  99. if ($x[1]>$y[1])
  100. {
  101. return -1;
  102. }
  103. if ($x[1]==$y[1])
  104. {
  105. if($x[8]<$y[8])
  106. {
  107. return 1;
  108. }
  109. if($x[8]>$y[8])
  110. {
  111. return -1;
  112. }
  113. if($x[8]==$y[8])
  114. {
  115. if($for[$x[12]][$y[12]]<$against[$x[12]][$y[12]])
  116. {
  117. return 1;
  118. }
  119. if($for[$x[12]][$y[12]]>$against[$x[12]][$y[12]])
  120. {
  121. return -1;
  122. }
  123. if($for[$x[12]][$y[12]]==$against[$x[12]][$y[12]])
  124. {
  125. if($x[10]<$y[10])
  126. {
  127. return 1;
  128. }
  129. if($x[10]>$y[10])
  130. {
  131. return -1;
  132. }
  133. if($x[10]==$y[10])
  134. {
  135. return 0;
  136. }
  137. }
  138. }
  139. }
  140. }
  141.  
  142. }
  143.  
  144. usort($playerstandings, 'sort_')


  1. for ($i=0; $i<$amount_of_players; $i++)
  2. {
  3. if ($playerstandings[$i][13]==0)
  4. {
  5. $miejsce=$i+1;
  6. echo("<tr height=19>
  7. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444;\">".$miejsce."</td>
  8. <td width=\"80\" class=\"srodek\" style=\"border: 1pt solid #444444\">".$playerstandings[$i][0]."</td>
  9. <td width=\"60\" class=\"srodek\" style=\"border: 1pt solid #444444\"><a href='gg:".$gg[$playerstandings[$i][12]]."'>".$gg[$playerstandings[$i][12]]."</a></td>
  10. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">".$playerstandings[$i][1]."</td>
  11. <td class=\"srodek\" width=\"25\" style=\"border: 1pt solid #444444\">".$playerstandings[$i][2]."</td>
  12. <td class=\"srodek\" width=\"25\" style=\"border: 1pt solid #444444\">".$playerstandings[$i][3]."</td>
  13. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">".$playerstandings[$i][4]."</td>
  14. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">".$playerstandings[$i][5]."</td>
  15. <td class=\"srodek\" width=\"25\" style=\"border: 1pt solid #444444\">".$playerstandings[$i][6]."</td>
  16. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">".$playerstandings[$i][7]."</td>
  17. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">".$playerstandings[$i][8]."</td>
  18. </tr>");
  19. }
  20. else if ($playerstandings[$i][13]==0.5)
  21. {
  22. echo("<tr height=19>
  23. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444;\">-</td>
  24. <td width=\"80\" class=\"srodek\" style=\"border: 1pt solid #444444\">".$playerstandings[$i][0]."</td>
  25. <td width=\"60\" class=\"srodek\" style=\"border: 1pt solid #444444\"><a href='gg:".$gg[$playerstandings[$i][12]]."'>".$gg[$playerstandings[$i][12]]."</a></td>
  26. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  27. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  28. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  29. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  30. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  31. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  32. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  33. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  34. </tr>");
  35. }
  36. else
  37. {
  38. echo("<tr height=19>
  39. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444;\">-</td>
  40. <td width=\"80\" class=\"srodek\" style=\"border: 1pt solid #444444\">".$playerstandings[$i][0]."</td>
  41. <td width=\"60\" class=\"srodek\" style=\"border: 1pt solid #444444\"><a href='gg:".$gg[$playerstandings[$i][12]]."'>".$gg[$playerstandings[$i][12]]."</a></td>
  42. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  43. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  44. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  45. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  46. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  47. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  48. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  49. <td width=\"25\" class=\"srodek\" style=\"border: 1pt solid #444444\">-</td>
  50. </tr>");
  51. }
  52. }
  53. $total_withdraws = 0;
  54. $total_matches = 0;
  55. $total_frames = 0;
  56. for ($i=0; $i<$amount_of_players; $i++)
  57. {
  58. if($withdraw[$i]!=0)
  59. {
  60. $total_withdraws++;
  61. }
  62. $total_matches = $total_matches + $matches[$i]/2;
  63. $total_frames = $total_frames + $frameswon[$i];
  64. }
  65. $active_players = $amount_of_players - $total_withdraws;
  66. if ($active_players>1)
  67. {
  68. $completion = ( $total_matches / ( ($active_players * ( $active_players - 1) ) / 2 ) ) * 100 ;
  69. }
  70. else
  71. {
  72. $completion = 100;
  73. }


jeśli potrzeba więcej kodu, to proszę pisać
Michael2318
Jaki chcesz osiągnąć efekt? Jak tablice wyglądają przed posortowaniem i jak mają wyglądać po sortowaniu?
Adzik1992
w pierwszym poście wkleiłem większą część kodu, tabela ma się sortować wg zdobytych punktów, różnicy wygranych/przegranych, będzie coś z tego?
_Borys_
Ogólnie to jest jakiś #bug z tym usort() w niektórych wersjach php.
Bug #50688 Using exceptions inside usort() callback function causes a warning
Spróbuj zagłuszyć błąd w linii z usort(), i zobacz jaki będzie efekt.
  1. @usort($playerstandings, 'sort_');
Adzik1992
efekt jest taki, że tylko nie pokazuje błędu, ale niestety nie sortuje
nie do naprawy?

edit:
pomogło usunięcie 3 linijek kodu:
  1. global $playerstandings;
  2. global $match;
  3. global $for, $against;


czy to dobrze? nie wpłynie to na działanie samego skryptu?
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.