2011-12-09 76 views
12

-------------- EDITAR ------------------------tabla HTML a array php

Así que voy con el enfoque DOM. Aquí es lo que tengo hasta ahora:

<?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 />"; 

     } 

    } 
?> 

El problema que estoy teniendo es que yo sólo deseo seleccionar el TD de cada fila de la tabla. Estoy tratando de lograr esto con un bucle anidado. Desafortunadamente está imprimiendo el texto de cada etiqueta en la página tantas veces como etiquetas. ¿Cómo puedo obtenerlo así que solo imprime el td de cada tr y no cada td en el dom?


Necesito usar una tabla html como fuente de mis datos porque no tengo acceso a la base de datos. Me imagino que para poder consultar los datos de la tabla html, necesito crear una función para convertir la tabla en una matriz o una matriz multidimensional.

Tengo la idea básica, pero creo que necesito ayuda para terminar el código y devolver una matriz basada en la tabla html.

También si usted tiene una mejor forma de hacerlo que no sea la conversión de la tabla a un array, por favor hágamelo saber

Aquí es la idea que tuve hasta ahora:

<?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

La mejor manera sería utilizar un analizador DOM, por ejemplo http://php.net/manual/en/book.dom.php – jli

+1

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

+0

¿'data.htm' solo contiene una tabla y su contenido, o es una página html completa con muchos más elementos? De todos modos, su código aún carece de toda la parte relacionada con el análisis sintáctico de los elementos de la tabla. IMO, buscaría una forma alternativa: no me gusta la idea de leer una tabla html. – jap1968

Respuesta

19

He actualizado tu edición para solucionarlo.

Para una demostración en vivo, ver 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

perfecto ... gracias – JDV590

+0

Declarar una función en una función es mala idea. Llamar a getData(); una segunda vez dará como resultado un error fatal 'Error fatal: no se puede redeclarar tdrows()'. –

+0

enlace roto .... – T30

1

Una forma de hacer esto más fácil es usar un analizador dom http://simplehtmldom.sourceforge.net/.

Aún tendrá que extraer la información en una matriz, pero esto hará que sea más fácil recorrer los elementos uno a uno.