• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

parsowanie tabeli danych

VPS Starter Arubacloud
0 głosów
811 wizyt
pytanie zadane 17 października 2019 w PHP przez Tomeksz104 Początkujący (280 p.)
otagowane ponownie 24 października 2019 przez Tomeksz104

Witajcie,

Parsuje sobie tabele, jednak moim sposobem strona wczytuje się bardzoo długo, chciałbym abyście powiedzieli jak zrobić to poprostu lepiej. Kod wygląda tak:

 <?php
    $context = stream_context_create(
        array(
            "http" => array(
                "header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
            )
        )
    );

    set_time_limit(300);
    ini_set('max_execution_time', 300);
    include('simple_html_dom.php');
    $html = file_get_html('https://sslecal2.forexprostools.com/?columns=exc_flags,exc_currency,exc_importance,exc_actual,exc_forecast,exc_previous&category=_employment,_economicActivity,_inflation,_credit,_centralBanks,_confidenceIndex,_balance,_Bonds&importance=1,2,3&features=datepicker,timezone,timeselector,filters&countries=25,6,60,43,5,9&calType=week&timeZone=57&lang=15', false, $context);
    foreach($html->find('td.event') as $wydarzenie) {
        $opis[] = $wydarzenie->innertext;
        $matches  = preg_grep ('/pkb|decyzja|cpi|zatrudnienia|detaliczna/i', $opis);
    }
    foreach($html->find("td.flagCur") as $waluta) {
        $tablica_waluta[] = $waluta->plaintext.'<br/>';
    }
    foreach($html->find("td.time") as $godzina) {
        $tablica_godzina[] = $godzina->plaintext.'<br/>';
    }
    foreach($html->find("td.bold") as $obecny) {
        $tablica_obecny[] = $obecny->plaintext.'<br/>';
    }
    foreach($html->find("td.prev") as $prognoza) {
        $tablica_prognoza[] = $prognoza->plaintext.'<br/>';
    }

    echo '<table>';
    echo '<tr><td>Godzina</td><td>Waluta</td><td>Wydarzenie</td></tr>';
    foreach ($matches as $id_wydarzenia => $wartosc) {
        echo '<tr>';
        foreach ($tablica_waluta as $id_waluty => $wartosc1) {
            foreach ($tablica_godzina as $id_godziny => $godzina) {
                foreach ($tablica_obecny as $id_obecny => $obecny) {
                    foreach ($tablica_prognoza as $id_prognoza => $prognoza) {
                            if ($id_wydarzenia == $id_waluty && $id_wydarzenia == $id_godziny && $id_wydarzenia == $id_obecny && $id_wydarzenia == $id_prognoza) {
                                echo "<td>" . $godzina . "</td><td>" . $wartosc1 . "</td><td>" . $wartosc . "</td><td>" . $obecny . "</td><td>" . $prognoza . "</td>";
                            }

                    }
                }
            }

        }
        echo '</tr>';
    }
    echo '</table>';
    ?>

Za wszelkie porady jak zrobić to tak jak powinno być dziękuje :)

3 odpowiedzi

+1 głos
odpowiedź 18 października 2019 przez michal_php Stary wyjadacz (13,700 p.)
Nie wiem jak wygląda cały kod tej aplikacji. Ale przy takiej skąpanej strukturze if oraz tylu pętlach to może trochę zamulać. Zadaj sobie pytanie czy nie da się inaczej przygotować tablicy tak aby nie petlować jej 5 a naprzyład 2 razy.Np $tablica_walutowa, $tablica_obecny, $tablica_godzinowa spiąć w jedną tablice przez co nie będziesz potrzebował tych 3 pętli. Druga kwestia to też jak zbudowaneś bazę danych oraz jakimi warunkami się do niej odwołujesz.Bo w 80% problem leży w samej budowie i sposobie odczytu informacji z bazy danych.
komentarz 18 października 2019 przez Tomeksz104 Początkujący (280 p.)

Dziękuje bardzo za odpowiedź i cenne porady. Cel jaki obrałem jest trudniejszy niż się spodziewałem, mam alternatywe dla mojego kodu ale wyciąga ona całą tabele, przez co np. nie moge posortować po swojemu, chyba że lepszym sposobem byłoby zapisanie całej tabeli do bazy danych a później filtrowanie ich na części, które mnie interesują, a że dopiero raczkuje w php, szukając alternatyw po internecie, siedzę trzeci dzień nad kilkoma linijkami kodu(a może każdy miał takie początki?) Wymyśliłem coś takiego, ale to nie działa, którędy droga może podpowiesz? :) 

$table = $html->find('table', 0);
    $row = array();
    foreach($table->find('tr') as $row) {
        $event = $row->find('td.event')->plaintext;
        $godzina = $row->find('td.time')->plaintext;

        $dane[] = [ 'name' => $event, 'status' => $godzina];
    }
    print_r($dane);

Notice: Trying to get property 'plaintext' of non-object in C:\xampp\htdocs\sky\kalendarz.php on line 56

Notice: Trying to get property 'plaintext' of non-object in C:\xampp\htdocs\sky\kalendarz.php on line 57

Powinno mi tutaj zwrócić tablice ale bez pętli nie wiem jak to zrobić

 

komentarz 19 października 2019 przez michal_php Stary wyjadacz (13,700 p.)

Powiem tak z takich małych fragmentów kodu ciężko coś powiedzieć. Ale nie rozumiem po co dałeś $row = array() ; ? Druga kwestia załóżmy że musisz pobrac cała bazę danych jaka masz. Przypuśćmy że zmienna $table zawiera w sobie cała tablecie wszystkich rekordów zmiennych. I to też w sumie ważne czy masz bazę danych zbudowana z relacji i kolekcji? Następnie użyj var_dump($tablica) tak aby zobaczyć jaka masz np strukturę. Bo jeśli np masz wszystko upakowane w jedną tabele to po pętli zrób tak 

foreach($tabl as $item){ 
  echo '$item[' name'] ';
}  

Ale to tylko przykład bo ciężko coś powiedzieć bez całego kodu. 

komentarz 24 października 2019 przez Tomeksz104 Początkujący (280 p.)

Dziękuje wszystkim, poradziłem sobie, ten kod który dawałem nie ma połączenia z bazą. On tylko parsuje i wyświetla dane. Gdyby ktoś kiedyś chciał zrobić coś podobnego przy użyciu simple html dom. Oto działający kod który wyciąga tylko interesujące nas dane z tabeli:

<?php
$context = stream_context_create(
    array(
        "http" => array(
            "header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
        )
    )
);

include('simple_html_dom.php');
$html = file_get_html('https://sslecal2.forexprostools.com/?columns=exc_flags,exc_currency,exc_importance,exc_actual,exc_forecast,exc_previous&category=_employment,_economicActivity,_inflation,_credit,_centralBanks,_confidenceIndex,_balance,_Bonds&importance=1,2,3&features=datepicker,timezone,timeselector,filters&countries=25,6,60,43,5,9&calType=week&timeZone=57&lang=15', false, $context);

echo "<table>";
echo "<tr><th>Data</th><th>Godzina</th><th>Waluta</th><th>Wydarzenie</th><th>Obecny</th><th>Prognoza</th><th>Poprzedni</th></tr>";
$data = "";
$i = 0;
foreach($html ->find('tr') as $tr) { 

    $zmiennaData = $tr->find('td.theDay',0);
    $godzina = $tr->find('td', 0);
    $waluta = $tr->find('td', 1);
    $zmiennaWydarzenie = $tr->find('td', 3);
    $obecny= $tr->find('td', 4);
    $prognoza = $tr->find('td', 5);
    $poprzedni = $tr->find('td', 6);
    if($zmiennaData){
        // echo $zmiennaData->plaintext."<br/>";
        $data = "$zmiennaData->plaintext";
    }
    if($zmiennaWydarzenie) {
        $rekordy[$i] = $zmiennaWydarzenie;
        $wydarzenie  = preg_grep ('/pkb|decyzja|cpi|zatrudnienia|detaliczna/i', $rekordy);
    }
    if(!empty($wydarzenie[$i]) && $godzina && $waluta && $obecny && $prognoza && $poprzedni) {

        echo "<tr>";
        echo "<td>".$data."</td><td>".$godzina->plaintext."</td><td>" . $waluta->plaintext ."</td><td>". $wydarzenie[$i]->plaintext."</td><td>". $obecny->plaintext."</td><td>". $prognoza->plaintext."</td><td>". $poprzedni->plaintext. "</td>";
        echo "</tr>";
    }

}
echo "</table>";
?>

Mniej pętli i działa natychmiastowo w porównaniu z pierwszym kodem.

Pozdrawiam

+1 głos
odpowiedź 18 października 2019 przez Ehlert Ekspert (212,630 p.)
Może skorzystaj z composera i panthera.
komentarz 18 października 2019 przez Tomeksz104 Początkujący (280 p.)
niestety  framework'i to jak narazie dla mnie czarna magia
komentarz 18 października 2019 przez Ehlert Ekspert (212,630 p.)
Ale panther to w sumie nie framework. Komponent od Symfony. Wystarczy trochę poczytać. Zachęcam bo dużo ogarniesz, a kod będzie lepszy.
0 głosów
odpowiedź 24 października 2019 przez Tomeksz104 Początkujący (280 p.)

Chciałbym mieć możliwość zmiany wyświetlania daty a następnie parsować skryptem który dałem wyżej. Jak to zrobić?

Podobne pytania

0 głosów
0 odpowiedzi 160 wizyt
pytanie zadane 26 października 2019 w PHP przez Tomeksz104 Początkujący (280 p.)
0 głosów
0 odpowiedzi 131 wizyt
pytanie zadane 26 października 2020 w Inne języki przez Lyokoheros Początkujący (340 p.)
0 głosów
0 odpowiedzi 521 wizyt
pytanie zadane 14 lutego 2020 w C i C++ przez amelia.cpp Obywatel (1,860 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...