Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Segregacja według dat wyników z kodu źródłowego innej strony
Forum PHP.pl > Forum > Przedszkole
honytowk
Witajcie mam pewien problem, otóż od pewnego czasu próbuje wyciągnąć dane (o wygranych turniejach) z portalu kurnik do swojego panelu administracyjnego (chce zrobić pewien system oceniania)

Ma to działać na zasadzie takiej że ludzie którzy będą się rejestrować na moim portalu [takimi samymi nickami jak na kurniku] zostaną wyświetleni w Panelu administracyjnym i ich turnieje które ostatnio wygrali

http://www.kurnik.pl/stat.phtml?uid=volt00...gid=ld&sk=5 <- tutaj pokazuje link ze statystykami przykładowego użytkownika i teraz z tego linku wyciągnąłem dane klasą " cutter " jest to klasa która wyciąga z podanej strony kod źródłowy a następnie ucina do pożądanych wyników.

w taki sposób wywołuje wyniki pożądanego usera:
  1. $w = new cutter('http://www.kurnik.pl/stat.phtml?uid='.$data["user_name"].'&gid=ld&sk=5', true);
  2. $w -> start('<table width="100%" cellspacing="2" cellpadding="2" border="0" class="ktb">', false, 1);
  3. $w -> end('</table>', false, -1);
  4. $w -> replace('</i>','<i>');
  5. $w -> replace('</b>','</i>');
  6. $w -> delete('<hr>');
  7. $w -> delete
  8. $datownik = $w->cut();
  9. echo"".$datownik."";


wynikiem jest:
Cytat
5299583 2010-12-28 (wto.) 00:30 volt00loca 3r, 2m 6 6 5299280 2010-12-27 (pon.) 22:40 nastka17 6r, 2m 16 12


Mogę oczywiście to pociąć na poszczególne elementy czyli zrobić oddzielnie zmienne do: id, daty, nicka założyciela konkursu

ale problem mam tego typu, że potrzebuje to posegregować według dat wyniki które są wyświetlane a zapisywać je do bazy nie mam za bardzo jak, ponieważ jeden user moze grać po kilka razy w tygodniu i wyświetli tak jak teraz 2 wyniki do jednego użytkownika.

Ma ktoś jakiś pomysł jak to posegregować nie zapisując do bazy ?

nie chce się narzucać, ale byłbym bardzo wdzięczny jeżeli ktoś z was zechciałby mi pomóc jeżeli tylko potrafi winksmiley.jpg
tehaha
ale w czym dokładnie problem? dostajesz wynik danych w jednej linijce, no to trzeba go przerobić na bardziej użyteczną formę, najpierw rozbić przez explode() na przecinku, żeby rekordy były oddzielnie, następnie rozbić na spacji po to aby dobrać się do daty, a całość danych przepisać do nowej tablicy gdzie data będzie kluczem(dzięki temu łatwo posegregujesz dane), i w niej będą tablice z danymi przypisanymi do tej daty.

kilka pętli i gotowe
honytowk
Cytat
a całość danych przepisać do nowej tablicy gdzie data będzie kluczem(dzięki temu łatwo posegregujesz dane), i w niej będą tablice z danymi przypisanymi do tej daty.
jak mam to zrobic ?
tehaha
tak:
  1. $data_set = array();
  2. $string = ' 2m 16 12 5299583 2010-12-28 (wto.) 00:30 volt00loca 3r, 2m 6 6 5299280 2010-12-27 (pon.) 22:40 nastka17 6r, 2m 16 12 5299583 2010-12-28 (wto.) 00:30 volt00loca 3r, 2m 6 6 5299280 2010-12-27 (pon.) 22:40 nastka17 6r';
  3.  
  4. $records = explode(',', $string); // rozbijamy na przecinku aby oddzielić od siebie poszczególne zestawy danych
  5. if(count($records))
  6. {
  7. foreach($records as $record)
  8. {
  9. $data = explode(' ', $record); // każdy rekord rozbijamy na spacji, aby rozdzielić dane
  10. $data = array_filter($data); // usuwamy wpisy z pustą wartością
  11.  
  12. if(!array_key_exists($data[5], $data_set))
  13. {
  14. $data_set[$data[5]] = array();
  15. }
  16. $data_set[$data[5]][] = array($data[1], $data[2], $data[3], $data[4], $data[6], $data[7], $data[8], $data[9]);
  17. }
  18. }
  19. print_r($data_set); //otrzymaliśmy tablicę, gdzie data jest kluczem
  20.  
  21. asort($data_set); // sortujemy od najmniejszej do największej zachowując klucze
  22.  
  23. print_r($data_set);
honytowk
5299583 2010-12-28 (wto.) 00:30 volt00loca 3r, 2m 6 6

5299280 2010-12-27 (pon.) 22:40 nastka17 6r, 2m 16 12


to są dwa różne wyniki one nie wyświetlają się po przecinku tylko w ciągłości (po spacji)

dokładnie tak: 5299583 2010-12-28 (wto.) 00:30 volt00loca 3r, 2m 6 6 5299280 2010-12-27 (pon.) 22:40 nastka17 6r, 2m 16 12

(teraz wyskakują mi błedy te arraye wyświetlaja mi się jako tekst)

tehaha
to podaj jakiś większy zestaw danych i napisz co jest czym i gdzie następuje rozdzielenie zestawów danych

//p.s. jak coś nie działa to wklejaj kod i treść błędu, a nie "wyskakuje jakiś błąd gdzieś tam kiedy robię coś tam bo coś nie działa"
honytowk
ok już wyjasniam co jest czym:

przykładowy wynik: 5299583 2010-12-28 (wto.) 00:30 volt00loca 3r, 2m 6 6


id 5299583 termin 2010-12-28 (wto.) 00:30 organizator volt00loca parametry 3r, 2m uczestników. 6 miejsce 6

tutaj link z tabelką http://www.kurnik.pl/stat.phtml?uid=volt00loca&gid=ld&sk=5 z której wyciągnąłem dane nazwa uzytkownika jest zawsze taka sama jak zarejestrowanego u mnie na stronie


a tak wygląda wyciąganie tych danych po stronie kodu:

  1. $i = 0;
  2. echo "<table cellpadding='0' cellspacing='0' width='100%'>\n<tr>\n";
  3. echo "<td class='tbl2'><strong>".$locale['401']."</strong></td>\n";
  4. echo "<td class='tbl2'><strong>".$locale['405']."</strong></td>\n";
  5. echo "<td align='center' width='1%' class='tbl2' style='white-space:nowrap'><strong>".$locale['402']."</strong></td>\n";
  6. echo "</tr>\n";
  7. $result = dbquery("SELECT user_id, user_name, user_status, user_level, user_groups FROM ".DB_USERS." WHERE user_status='0'".$orderby." ORDER BY user_level DESC, user_name LIMIT ".$_GET['rowstart'].",20");
  8. while ($data = dbarray($result)) {
  9.  
  10. $cell_color = ($i % 2 == 0 ? "tbl1" : "tbl2"); $i++;
  11. $w = new cutter('http://www.kurnik.pl/stat.phtml?uid='.$data["user_name"].'&gid=ld&sk=5', true); // $data["user_name"] to nazwa uzytkownika z mojej bazy, ktora wprowadzam do linku z kurnika zeby sprawdzic czy jest taka osoba na kurniku i jakie ma wyniki
  12. $w -> start('<table width="100%" cellspacing="2" cellpadding="2" border="0" class="ktb">', false, 1);
  13. $w -> end('</table>', false, -1);
  14. $w -> replace('</i>','<i>');
  15. $w -> replace('</b>','</i>');
  16. $w -> delete('<hr>');
  17. $w -> delete('<th width="26%">termin</th>','<tr class="kbl">','<th width="9%">id</th>','<th width="24%">organizator</th>','<th width="20%">parametry</th>','<th class="tar" width="8%">ucz.</th>','<th class="tar" width="8%">m-ce</th>','<tr>','<td>','</tr>','</td>','<td class="tar">');
  18.  
  19.  
  20. $wynik = $w->cut();
  21.  
  22. echo "<tr>\n<td class='$cell_color'>\n".profile_link($data['user_id'], $data['user_name'], $data['user_status'])."</td>\n";
  23.  
  24. echo "<td class='$cell_color'>";
  25.  
  26.  
  27.  
  28. echo"".$wynik."</td>\n"; // tutaj jest zmienna ktora wyswietla wyniki jezeli ktos ma konto na kurniku o tym samym nicku co na mojej stronie
  29. echo "<td align='center' width='1%' class='$cell_color' style='white-space:nowrap'></td>\n</tr>";
  30. }
  31. echo "</table>\n";
  32. } else {
  33. echo "<div style='text-align:center'><br />\n".$locale['403'].$_GET['sortby']."<br /><br />\n</div>\n";
  34. }



teraz do rzeczy chodzi mi o to że wyświetlane wyniki mają swoją datę i potrzebuje te wyniki wraz z użytkownikami posegregować według dat nie wiem jak to zrobić pewnie trzeba jakoś wyprowadzić sam wynik daty bez tych wszystkich id, organizatorów itp i wtedy ułożyć jakąś tablice, nie mam pojęcia jak to zrobić więc proszę o pomoc winksmiley.jpg

wyświetlają sie w takiej postaci 2 wyniki turniejów od jednego usera (zaznaczam że moze byc ich wiecej to zalezy ile razy sobie zagrał na kurniku):
Cytat
5299583 2010-12-28 (wto.) 00:30 volt00loca 3r, 2m 6 6 5299280 2010-12-27 (pon.) 22:40 nastka17 6r, 2m 16 12

te dwie daty trzeba jakoś wyciagnąć i pozniej posegregować wyniki
tehaha
no dobra, ale skoro sam wyciągasz te dane, to przecież możesz poszczególne zestawy danych oddzielić np. średnikami, żeby było
5299583 2010-12-28 (wto.) 00:30 volt00loca 3r, 2m 6 6;5299583 2010-12-28 (wto.) 00:30 volt00loca 3r, 2m 6 6;5299583 2010-12-28 (wto.) 00:30 volt00loca 3r, 2m 6 6;

a potem przerobisz to takim sposobem co Ci podałem, najpierw rozbijasz na średniku, a potem na spacji i rozdzielasz dane do tablicy, w czym problem?
honytowk
no tak ale jak ten zestaw podzielić na wyniki bo id może sie zwiększyć (wiecej cyfr) to też nie moge zrobic żeby ucinało po tylu, i tylu znakach.
Znasz jakieś inne rozwiązanie żeby tam postawić średnik?
tehaha
a możesz mi pokazać gdzie ja zrobiłem, że ucina po konkretnej liczbie znaków? czytałeś w ogóle tamten skrypt co Ci dałem?

//ale co nie możesz średnika postawić? przecież w jakiś sposób tą swoją klasą wyciągasz dane z każdego rzędu tabeli, no to czy po tym rzędzie nie możesz w wyniku postawić separatora?


w ogóle to widzę, że źle się do tego zabrałeś a wystarczyło chwilo poguglować aby znaleźć prosty sposób na parsowanie tabeli -> http://stackoverflow.com/questions/4057574...atch-all-in-php

korzystając z tego sposobu i dorzucając proste przepisanie tablicy:

  1. $htmlContent = '
  2. <table width="100%" cellspacing="2" cellpadding="2" border="0" class="ktb">
  3. <tr class="kbl">
  4. <th width="9%">id</th>
  5. <th width="26%">termin</th>
  6. <th width="24%">organizator</th>
  7. <th width="20%">parametry</th>
  8. <th class="tar" width="8%">ucz.</th>
  9. <th class="tar" width="8%">m-ce</th>
  10. </tr>
  11.  
  12. <tr>
  13. <td><a href="/turn.phtml?tid=5299583">5299583</a></td>
  14. <td>2010-12-28 (<tt>wto.</tt>) 00:30</td>
  15. <td><a href="/stat.phtml?gid=ld&amp;uid=volt00loca">volt00loca</a></td>
  16. <td>3r, 2m</td>
  17. <td class="tar">6</td>
  18. <td class="tar">6</td>
  19. </tr>
  20. <tr>
  21.  
  22. <td><a href="/turn.phtml?tid=5299280">5299280</a></td>
  23. <td>2010-12-27 (<tt>pon.</tt>) 22:40</td>
  24. <td><a href="/stat.phtml?gid=ld&amp;uid=nastka17">nastka17</a></td>
  25. <td>6r, 2m</td>
  26. <td class="tar">16</td>
  27. <td class="tar">12</td>
  28. </tr>
  29. </table>
  30.  
  31. ';
  32.  
  33. $dom = new DOMDocument;
  34. $dom->loadHTML( $htmlContent );
  35. $rows = array();
  36. foreach( $dom->getElementsByTagName( 'tr' ) as $tr ) {
  37. $cells = array();
  38. foreach( $tr->getElementsByTagName( 'td' ) as $td ) {
  39. $cells[] = $td->nodeValue;
  40. }
  41. if(count($cells)) $rows[] = $cells;
  42.  
  43. }
  44. print_r($rows);
  45.  
  46. $new_data_set = array();
  47. //do tego punktu przerobiliśmy tabelę na praktyczną tablicę w php
  48. if(count($rows))
  49. {
  50. foreach($rows as $value)
  51. {
  52. $date_set = explode(' ', $value[1]);
  53. if(!array_key_exists($date_set[0], $new_data_set)) $new_data_set[$date_set[0]] = array();
  54. $new_data_set[$date_set[0]][] = array
  55. (
  56. 'id'=>$value[0],
  57. 'date'=>$date_set[0],
  58. 'day'=>$date_set[1],
  59. 'time'=>$date_set[2],
  60. 'params'=>$value[3],
  61. 'players'=>$value[4],
  62. 'result'=>$value[5]
  63. );
  64. }
  65. }
  66. asort($new_data_set);
  67. print_r($new_data_set);


otrzymujesz tablicę z ładnie porozdzielanymi parametrami, posortowanymi datą:
  1. Array
  2. (
  3. [2010-12-27] => Array
  4. (
  5. [0] => Array
  6. (
  7. [id] => 5299280
  8. [date] => 2010-12-27
  9. [day] => (pon.)
  10. [time] => 22:40
  11. [params] => 6r, 2m
  12. [players] => 16
  13. [result] => 12
  14. )
  15.  
  16. )
  17.  
  18. [2010-12-28] => Array
  19. (
  20. [0] => Array
  21. (
  22. [id] => 5299583
  23. [date] => 2010-12-28
  24. [day] => (wto.)
  25. [time] => 00:30
  26. [params] => 3r, 2m
  27. [players] => 6
  28. [result] => 6
  29. )
  30.  
  31. )
  32.  
  33. )
  34.  
honytowk
Super wszystko działa tak jak powinno. Mam jeszcze jedno pytanie chciałbym umieścić rozwijana liste z miesiacami w ktorych były turnieje czyli klikam na selecta z lista i wybieram np styczen po czym pokazuje mi wszystko ze stycznia danej gry tutaj moja całą konstrukcja pliku
  1. require_once "maincore.php";
  2. require_once THEMES."templates/header.php";
  3. include LOCALE.LOCALESET."members.php";
  4. include "class.cutter.php";
  5.  
  6. add_to_title($locale['global_200'].$locale['400']);
  7.  
  8. if(!isset($_POST['game'])) { $_POST['game'] = 'ld'; }
  9. opentable($locale['400']);
  10. echo"<form action='".FUSION_SELF."?game=".$_POST['game']."' method='post'>
  11. <select name='game'>
  12. <option value='ld' ".($_POST['game'] == 'ld' ? "selected='selected'" : "").">Chińczyk</option>
  13. <option value='sw' ".($_POST['game'] == 'sw' ? "selected='selected'" : "").">Makao</option>
  14. <option value='dm' ".($_POST['game'] == 'dm' ? "selected='selected'" : "").">Domino</option>
  15. <option value='dc' ".($_POST['game'] == 'dc' ? "selected='selected'" : "").">Kosci</option>
  16. <option value='gn' ".($_POST['game'] == 'gn' ? "selected='selected'" : "").">Remik gin</option>
  17. <option value='th' ".($_POST['game'] == 'th' ? "selected='selected'" : "").">Tysiac</option>
  18. </select>
  19. <input type='submit' value='ok' /></form>";
  20. if (iMEMBER) {
  21. if (!isset($_GET['sortby']) || !ctype_alnum($_GET['sortby'])) { $_GET['sortby'] = "all"; }
  22. $orderby = ($_GET['sortby'] == "all" ? "" : " AND user_name LIKE '".stripinput($_GET['sortby'])."%'");
  23. $result = dbquery("SELECT user_id FROM ".DB_USERS." WHERE user_status='0'".$orderby);
  24. $rows = dbrows($result);
  25. if (!isset($_GET['rowstart']) || !isnum($_GET['rowstart'])) { $_GET['rowstart'] = 0; }
  26. if ($rows) {
  27. $i = 0;
  28. echo "<table cellpadding='2' cellspacing='0' width='100%'>\n<tr>\n";
  29. echo "<td class='tbl2'><strong>Nick </strong></td>\n";
  30. echo "<td class='tbl2'><strong>Wyniki</strong></td>\n";
  31. echo "<td align='center' width='1%' class='tbl2' style='white-space:nowrap'><strong>Punkty</strong></td>\n";
  32. echo "</tr>\n";
  33. $result = dbquery("SELECT user_id, user_name, user_status, user_level, user_groups FROM ".DB_USERS." WHERE user_status='0'".$orderby." LIMIT ".$_GET['rowstart'].",20");
  34. while ($data = dbarray($result)) {
  35.  
  36. $cell_color = ($i % 2 == 0 ? "tbl1" : "tbl2"); $i++;
  37. $w = new cutter('http://www.kurnik.pl/stat.phtml?uid='.$data["user_name"].'&gid='.$_POST['game'].'&sk=5', true);
  38. $w -> start('
  39. </ul>
  40. </div>', false, 1);
  41. $w -> end('<p>', false, -1);
  42. $w -> replace('</i>','<i>');
  43. $w -> replace('</b>','</i>');
  44. $w -> delete('<hr>');
  45.  
  46.  
  47. $htmlContent = $w->cut();
  48.  
  49. $dom = new DOMDocument;
  50. @$dom->loadHTML( $htmlContent );
  51. $rows = array();
  52. foreach( $dom->getElementsByTagName( 'tr' ) as $tr ) {
  53. $cells = array();
  54. foreach( $tr->getElementsByTagName( 'td' ) as $td ) {
  55. $cells[] = $td->nodeValue;
  56. }
  57. if(count($cells)) $rows[] = $cells;
  58.  
  59. }
  60.  
  61.  
  62. $new_data_set = array();
  63. //do tego punktu przerobiliśmy tabelę na praktyczną tablicę w php
  64. if(count($rows))
  65. {
  66. foreach($rows as $value)
  67. {
  68. $date_set = explode(' ', $value[1]);
  69. if(!array_key_exists($date_set[0], $new_data_set)) $new_data_set[$date_set[0]] = array();
  70. $new_data_set[$date_set[0]][] = array
  71. (
  72. 'id'=>$value[0],
  73. 'date'=>$date_set[0],
  74. 'day'=>$date_set[1],
  75. 'time'=>$date_set[2],
  76. 'params'=>$value[3],
  77. 'players'=>$value[4],
  78. 'result'=>$value[5]
  79. );
  80.  
  81.  
  82.  
  83.  
  84.  
  85. echo "<tr>\n<td class='$cell_color'>\n".profile_link($data['user_id'], $data['user_name'], $data['user_status'])."</td>\n";
  86.  
  87. echo "<td class='$cell_color'>";
  88.  
  89.  
  90.  
  91. if($new_data_set){echo"Turniej: <a href='http://www.kurnik.pl/turn.phtml?tid=".$value['0']."'>".$value['0']."</a> Data: ".$date_set['0']." organizator: <a href='http://www.kurnik.pl/stat.phtml?gid=".$_POST['game']."&uid=".$value['2']."'>".$value['2']."</a> Parametry: ".$value['3']." Uczestników: ".$value['4']." Miejsce: ".$value['5']." "; }echo"</td>\n";
  92. }
  93. }
  94. echo "<td align='center' width='1%' class='$cell_color' style='white-space:nowrap'></td>\n</tr>";
  95. }
  96. echo "</table>\n";
  97. } else {
  98. echo "<div style='text-align:center'><br />\n".$locale['403'].$_GET['sortby']."<br /><br />\n</div>\n";
  99. }
  100. $search = array(
  101. "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R",
  102. "S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9"
  103. );
  104. echo "<hr />\n<table cellpadding='0' cellspacing='1' class='tbl-border center'>\n<tr>\n";
  105. echo "<td rowspan='2' class='tbl2'><a href='".FUSION_SELF."?sortby=all'>".$locale['404']."</a></td>";
  106. for ($i = 0; $i < 36 != ""; $i++) {
  107. echo "<td align='center' class='tbl1'><div class='small'><a href='".FUSION_SELF."?sortby=".$search[$i]."'>".$search[$i]."</a></div></td>";
  108. echo ($i == 17 ? "<td rowspan='2' class='tbl2'><a href='".FUSION_SELF."?sortby=all'>".$locale['404']."</a></td>\n</tr>\n<tr>\n" : "\n");
  109. }
  110. echo "</tr>\n</table>\n";
  111. } else {
  112. redirect("index.php");
  113. }
  114. closetable();
  115.  
  116. require_once THEMES."templates/footer.php";
  117. ?>


czy miałby ktoś jakiś pomysł jak to zrobić?
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.