2011-12-09 25 views
12

-------------- EDIT ------------------------tabella HTML per array php

Quindi vado con l'approccio DOM. Ecco quello che ho finora:

<?php function getdata(){ 
    $contents = file_get_contents('internatdata.htm'); 
    //create a DOM based off of the string from the html table 
    $DOM = new DOMDocument; 
    $DOM->loadHTML($contents); 

    //get all tr and td 
    $items = $DOM->getElementsByTagName('tr'); 
    $tds = $DOM->getElementsByTagName('td'); 

    function tdrows($elements){ 
     $str = ""; 
     for ($ii =0; $ii < $elements->length; $ii++){ 
      $str .= $elements->item($ii)->nodeValue . ","; 


      } 
      return $str; 
     } 

    for ($i = 0; $i < $items->length; $i++){ 


     echo tdrows($tds) . "; <br />"; 

     } 

    } 
?> 

Il problema che sto avendo è che voglio solo selezionare il TD da ogni riga della tabella. Sto cercando di ottenere questo risultato con un ciclo annidato. sfortunatamente sta stampando il testo di ogni tag sulla pagina quante volte quante sono le tag. come posso ottenerlo così sta stampando solo il td di ogni tr e non tutti i td sul dom?


Ho bisogno di utilizzare una tabella html come fonte dei miei dati perché non ho accesso al database. Immagino di essere in grado di interrogare i dati dalla tabella html Ho bisogno di creare una funzione per convertire la tabella in una matrice, o una matrice multidimensionale.

Ho l'idea di base che penso ma ho bisogno di aiuto per completare il codice per restituire un array basato sulla tabella html.

Inoltre se si dispone di un modo migliore di fare questo altro che convertire la tabella in un array, allora per favore fatemelo sapere

Qui è l'idea che ho avuto finora:

<?php 
function getdata(){ 

    $contents = file_get_contents('data.htm'); 
    //add delimiters (semicolon for a row and comma for a cell) ??? 

    $stripped = strip_tags($contents); 

    //explode into an array based off the delimiters above ??? 


    } 
    ?> 
+4

il modo migliore sarebbe quella di utilizzare un parser DOM, ad esempio http://php.net/manual/en/book.dom.php – jli

+1

http: //stackoverflow.com/questions/3627489/php-parse-html-code –

+0

Do 'data.htm' contiene solo una tabella e il suo contenuto, oppure è una pagina html completa con molti più elementi? Ad ogni modo, al tuo codice manca ancora tutta la parte relativa all'analisi degli elementi della tabella. IMO, vorrei cercare un modo alternativo: non mi piace l'idea di leggere un tavolo html. – jap1968

risposta

19

Ho aggiornato la tua modifica per risolvere il problema.

Per una dimostrazione dal vivo, vedere http://codepad.viper-7.com/Vu5WdK

function tdrows($elements) 
{ 
    $str = ""; 
    foreach ($elements as $element) { 
     $str .= $element->nodeValue . ", "; 
    } 

    return $str; 
} 

function getdata() 
{ 
    $contents = "<table><tr><td>Row 1 Column 1</td><td>Row 1 Column 2</td></tr><tr><td>Row 2 Column 1</td><td>Row 2 Column 2</td></tr></table>"; 
    $DOM = new DOMDocument; 
    $DOM->loadHTML($contents); 

    $items = $DOM->getElementsByTagName('tr'); 

    foreach ($items as $node) { 
     echo tdrows($node->childNodes) . "<br />"; 
    } 
} 

getdata(); 
+0

perfect..thank you – JDV590

+0

Dichiarare una funzione in una funzione è una pessima idea. Chiamando getData(); una seconda volta si tradurrà in un errore fatale 'Errore fatale: impossibile redclare tdrows()'. –

+0

collegamento interrotto .... – T30

1

Un modo per rendere più semplice l'uso di un pars pars http://simplehtmldom.sourceforge.net/.

È ancora necessario estrarre le informazioni in un array, ma ciò renderà più semplice scorrere gli elementi uno per uno.