Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pobranie wartości z tabeli
Forum PHP.pl > Forum > Przedszkole
Ulysess
witam dziś już próbowałem w innym temacie rozwiązania tego problemu ale nie udało mi się .......... podejrzewam że źle chciałem się do tego zabrać więc zacznę od początku. otóż mam tabele w której oprócz 1 wiersza następne wyglądają tak:
  1. <tr id="tlo_piaskowe_czarne" align="center">
  2. <td height="20">40.</td>
  3. <td><b><font color="#FF9900">Marek</font></b></td>
  4. <td><b>23</b></td>
  5. <td>152,767</td>
  6. </tr>


chciałbym dla wszystkich wierszy pobrać wartości z 2 3 i 4 Kolumny jak miało by to wyglądać ,czy to jest do wykonania questionmark.gif jeśli tak to jak.. z góry dziękuje za zainteresowanie.
Daiquiri
Na chama możesz przecież skorzystać z explode()... chyba, że czegoś nie rozumiem smile.gif.
Ulysess
hmmm pisze z pamięci ale czy to miało by tak wyglądac:
  1. $tablica = explode("<td> ", $strona);

questionmark.gif jesli tak to czy nie powstała by 1 wielka tablica questionmark.gif
Daiquiri
Zakładałam, że tabelkę z HTML masz w zmiennej. Wtedy otrzymasz tablicę z pozycjami wierszy. Dodatkowa pętla może Ci pomóc "zgarnąć" tylko te dane, które Cię interesują.
Ulysess
cała zawartosc strony jest pod zmienna.. ;p mógłbyś mniej więcej pokazać jak by to miało wyglądać questionmark.gif
lord2105
  1. $tablica = explode("<td> ", $strona);


później daj sobie:

  1. var_dump($tablica);


i wedle kluczy wyciągnij co potrzebujesz:

np:

  1. echo $tablica[3];
Ulysess
żeby nie czekac na gotowe sam kombinuje , zapewne początek wygląda tak
  1. $tablica = explode("<tr id=\"tlo_piaskowe_czarne\" align=\"center\">", $page);
questionmark.gif

Daiquiri
Najpierw wyciągnij sobie do zmiennej samą tabelkę (sposobem dowolnym). Potem np. $tab = explode("<td>", $zmienna) - otrzymasz tablicę z poszczególnymi wierszami. Wyczyść ją z tagów htmlowskich i skorzystaj z np. pętli, żeby wyciągnąć tylko te dane, które Cię interesują. Jeżeli interesuje Cię np. co trzecia wartość z tablicy wszystkich danych, to:
  1. for ($i=0; $i < count($tab); ++$i) {
  2. if ($i%3 == 0) $tab2[] = $tab[$i];
  3. }


@up
Explode() rób z wartości powtarzalnych. Pierwsza wartość jest przecież "dzielnikiem".
Ulysess
hmm zrobiłem specialnie zmienną tylko z 2 wierszami TR ->
  1. $page = '<tr id="tlo_piaskowe_czarne" align="center">
  2. <td height="20">40.</td>
  3. <td><b><font color="#FF9900">Marek</font></b></td>
  4. <td><b>23</b></td>
  5. <td>152,767</td>
  6. </tr>
  7. <tr id="tlo_piaskowe_czarne" align="center">
  8. <td height="20">41.</td>
  9. <td><b><font color="#FF9900">Jurek</font></b></td>
  10. <td><b>23</b></td>
  11. <td>152</td>
  12. </tr>
  13. ';
  14.  
  15. $tablica = explode("<td>", $page);
  16. for($i = 0;$i <= count($tablica);++$i)
  17. {
  18. echo strip_tags($tablica[$i]),'('.$i.')<br>';
  19. }


wydaje mi się że zrobiłem tak jak opisałeś Daiquiri i wychodzi (w moim przykładzie) że każda wartość to oddzielna zmienna.. to jak ja teraz rozpoznam że tablica1,2,3,4,5 jest Marka 6,7,8,9,10 Jurka itd.... questionmark.gif mam nadzieje że coś źle robie..
Daiquiri
Bo korzystasz ze złego parametru w explode(). Przecież <td> nie występuje wszędzie (<td> to nie to samo co <td height="20">). Jeżeli natomiast interesują Cię dane bez tego co w <td height="20"> to zacznij od $i=1 nie $i=0.
Ulysess
próbowałem to rozbić jeszcze bardziej i coś nie wychodzi..

  1. $tablica = explode("<td ", $page);
  2. for($i = 1;$i <= count($tablica)-1;++$i)
  3. {
  4. $tablica[$i] = strip_tags($tablica[$i]);
  5.  
  6. $tablica2 = explode(" ",$tablica[$i]);
  7.  
  8. for($k = 0;$k<=count($tablica2);++$k)
  9. {
  10. echo $tablica2[$k],'<br>';
  11. }
  12.  
  13. }


chodzi o to że chce zrobić aby każdy wiersz był w 1 wymiarze tablicy a w 2 znajdowaly się dla niego 3-4 dane niestety coś źle robie.. :/
Daiquiri
  1. $tab1 = explode('<td height="20">', $page);
  2.  
  3. for ($i=1; $i<count($tab1); ++$i) {
  4. $tab2 = explode('<td>', $tab1[$i]);
  5.  
  6. for ($j=0; $j<count($tab2); ++$j) {
  7. echo $j . ". " . strip_tags($tab2[$j]) . "<br />";
  8. }
  9.  
  10. }



lub to samo tylko z zapisem do tablicy:
  1. $tab1 = explode('<td height="20">', $page);
  2.  
  3. for ($i=1; $i<count($tab1); ++$i) {
  4. $tab2 = explode('<td>', $tab1[$i]);
  5.  
  6. for ($j=0; $j<count($tab2); ++$j) {
  7. $tab[$i][$j] = strip_tags($tab2[$j]);
  8. }
  9.  
  10. }


Wtedy:
tab[0][0] - to będzie 40, tab[0][1] - to będzie "Marek" itd.
tab[1][0] - to będzie 41, tab[1][1] - to będzie "Jurek" itd.
Quantum
explode tutaj ? bardziej sprawdziło by się przy rozbijaniu jakiegoś stringa na tablicę stałym separatorem, w tym przypadku dochodzi czyszczenie z tagów - zbędne.
  1. $source = '...'; // zawartość strony
  2.  
  3. preg_match_all('#<tr id=".*" align="center">
  4. <td height="20">.*</td>
  5. <td><b><font color=".*">(.*)</font></b></td>
  6. <td><b>(.*)</b></td>
  7. <td>(.*)</td>
  8. </tr>#', $source, $matches);
  9.  
  10. print_r($matches);

za (.*) możesz podstawić bardziej określony typ danych, ale to już zależy co tam w tej tabelce przedstawiasz
Daiquiri
Explode() było alternatywą (chamską, ale zawsze) dla preg_match.
Quantum
swoją drogą, żeby nie wykonywać za każdym razem count($tab1) w for dobrą praktyką jest przypisywanie liczby do zmiennej i podstawianie w pętli, funkcja wykona się tylko raz, a nie tyle ile elementów ma tablica winksmiley.jpg
Daiquiri
Masz oczywiście rację smile.gif. Zwykle pomijam też takie rzeczy jak klamra w drugim for, ale chodziło mi tylko o ogólną koncepcję.
Ulysess
wielkie dzięki za rozwiązanie problemu .. smile.gif niestety rozwiązanie z preg match nie działa poprawnie.. i jeszcze takie pytanie.. czemu jeśli robie pętla w pętli to nie powinienem zamykać tej drugiej klamrą questionmark.gif
Daiquiri
Możesz oczywiście zamknąć - ja po prostu zwykle to pomijam smile.gif. Na studiach zawsze nas facet od Javy ścigał za te klamry, bo w zasadzie nie trzeba ich tam stawiać.
Quantum
działa jak należy, tylko nie zrób wcięć w patternie przypadkiem smile.gif

  1. $source = '<tr id="tlo_piaskowe_czarne" align="center">
  2. <td height="20">40.</td>
  3. <td><b><font color="#FF9900">Marek</font></b></td>
  4. <td><b>23</b></td>
  5. <td>152,767</td>
  6. </tr>
  7. <tr id="tlo_piaskowe_czarne" align="center">
  8. <td height="20">41.</td>
  9. <td><b><font color="#FF9900">Jurek</font></b></td>
  10. <td><b>23</b></td>
  11. <td>152</td>
  12. </tr>';
  13.  
  14. preg_match_all('#<tr id=".*" align="center">
  15. <td height="20">.*</td>
  16. <td><b><font color=".*">(.*)</font></b></td>
  17. <td><b>(.*)</b></td>
  18. <td>(.*)</td>
  19. </tr>#', $source, $matches);
  20.  
  21. $length = count($matches[0]);
  22.  
  23. for ( $i = 0; $i < $length; $i++ )
  24. {
  25. echo '1: ', $matches[1][$i];
  26. echo '<br/>2: ', $matches[2][$i];
  27. echo '<br/>3: ', $matches[3][$i];
  28. echo '<br/>', str_repeat('-', 10), '<br/>';
  29. }

powinieneś dostać taki wynik:
Kod
1: Marek
2: 23
3: 152,767
----------
1: Jurek
2: 23
3: 152
----------
Ulysess
oo wielkie dzięki , działa smile.gif
ciekawostką jest to że rozwiązanie z explode wykonuje się szybciej od preg_match_all smile.gif
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.