Partage
  • Partager sur Facebook
  • Partager sur Twitter

[DOM] Conversion html table to array php

    3 janvier 2014 à 17:30:00

    Bonjour a tous et bonne année =D.
    Travaillant actuellement sur un projet consistant a réaliser un interface de calcul matriciels, je me retrouve confronter un petit soucis. 
    J'essaye désespérément de convertir ma table html en tableau php afin de pouvoir effectuer les différents calculs de matrices.
    Pour ne pas vous piquez les yeux, je vous met un code html de test : 
    <html>
        <body>
            <table name="lol" id="tab1">
                <tr>
                    <td>a</td>
                    <td>b</td>
                    <td>c</td>
                </tr>
                <tr>
                    <td>d</td>
                    <td>e</td>
                    <td>f</td>
                </tr>
                
            </table>
            
            <table id="tab2">
                <tr>
                    <td>1</td>
                    <td>2</td>
                    <td>3</td>
                </tr>
                <tr>
                    <td>4</td>
                    <td>5</td>
                    <td>6</td>
                </tr>
                
            </table>
        </body>
    </html>
    Donc deux tableaux html tout simple.
    J'arrive a récupérer et a convertir la première table du document html grâce a ce bout de code :
     <?php
    
    $dom = new DOMDocument();
    
    $html = $dom->loadHTMLFile("htmlTest.html");
    
    $dom->preserveWhiteSpace = false;
    
    $tables = $dom->getElementsByTagName('table');
    
    
    //get all rows from the table
    $rows = $tables->item(0)->getElementsByTagName('tr');
    // get each column by tag name
    $cols = $rows->item(0)->getElementsByTagName('th');
    $row_headers = NULL;
    foreach ($cols as $node) {
        //print $node->nodeValue."\n";
        $row_headers[] = $node->nodeValue;
    }
    
    $table = array();
    //get all rows from the table
    $rows = $tables->item(0)->getElementsByTagName('tr');
    foreach ($rows as $row)
    {
        // get each column by tag name
        $cols = $row->getElementsByTagName('td');
        $row = array();
        $i=0;
        foreach ($cols as $node) {
            # code...
            //print $node->nodeValue."\n";
            if($row_headers==NULL)
                $row[] = $node->nodeValue;
            else
                $row[$row_headers[$i]] = $node->nodeValue;
            $i++;
        }
        $table[] = $row;
    }
    
    print_r($table);
    Ce qui me donne en sortie : 
    Array
    (
        [0] => Array
            (
                [0] => a
                [1] => b
                [2] => c
            )
    
        [1] => Array
            (
                [0] => d
                [1] => e
                [2] => f
            )
    
    )
    Le problème étant que l'algorithme php ne convertit que la première table rencontré sur la page. Et oublie toutes les autres. J'ai essayer d'utiliser différents sélecteur pour appliquer le code sur les tables que je désirais et ainsi juste a répéter ce code avec deux sélecteurs pour les deux tables, mais rien y fait...
    Si certains d'entre vous savais comment résoudre ce problème ou encore avais d'autres idées pour arriver au même résultat, je lui en serais grandement reconnaissant ^^.
    Pour finir je tiens a signaler que j'aurais besoin du coup de deux tableau afin de faciliter les calculs entre eux. Si ça peut également servir (ou déservire ><) le tableau html dans le cas réelle est généré dynamiquement a partir du nombre de lignes et de colonnes saisie par l'utilisateur.
    Voila en espérant recevoir une aide précieuse, merci de m'avoir lu.
    Fred
    • Partager sur Facebook
    • Partager sur Twitter
      3 janvier 2014 à 19:54:48

      Bonsoir,

      $dom    = DOMDocument::loadHTMLFile("html.html");
      $tables = $dom->getElementsByTagName('table');
      
      $a = array();
      foreach($tables as $k => $table) {
      	foreach($table->getElementsByTagName('tr') as $td) {
      		$a['table_' . $k][] = array_values(array_filter(explode(' ', str_replace(array("\n", "\r"), "", $td->nodeValue))));
      	}
      }  
      // var_dump($a);
      
      var_dump($a['table_0']); // $table_0 = $a['table_0'];
      
      /**
      array
        0 => 
          array
            0 => string 'a' (length=1)
            1 => string 'b' (length=1)
            2 => string 'c' (length=1)
        1 => 
          array
            0 => string 'd' (length=1)
            1 => string 'e' (length=1)
            2 => string 'f' (length=1)
      */
      
      var_dump($a['table_1']); // $table_1 = $a['table_1'];
      
      /**
      array
        0 => 
          array
            0 => string '1' (length=1)
            1 => string '2' (length=1)
            2 => string '3' (length=1)
        1 => 
          array
            0 => string '4' (length=1)
            1 => string '5' (length=1)
            2 => string '6' (length=1)
      */	



      -
      Edité par d2v 4 janvier 2014 à 12:29:58

      • Partager sur Facebook
      • Partager sur Twitter
        3 janvier 2014 à 21:04:06

        Bonsoir,

        Merci pour cette réponse rapide.

        N'est il pas possible de se retrouver avec deux tableaux contenant leurs table respectif plutôt qu'un tableau qui lui contient les deux table ? Ca simplifierais énormément la suite pour les calculs matriciel sachant que mes algo de calcul prennent tous deux tableau en paramètre.

        Encore merci =D

        -
        Edité par castilf 3 janvier 2014 à 21:05:44

        • Partager sur Facebook
        • Partager sur Twitter
          3 janvier 2014 à 21:24:59

          Salut !

          La solution qui t'a été proposée est la plus simple et la plus polyvalente, parce qu'elle est indépendante du nombre de tableaux qu'il y a dans la page.
          Après s'il te faut deux tableau, ben ce sont les deux éléments au premier niveau, donc table_0 et table_1. Les récupérer séparément n'est pas un si gros problème, non ?  ;)
          Note que ça ne me paraît pas absolument nécessaire.

          -
          Edité par Ymox 31 octobre 2017 à 0:14:12

          • Partager sur Facebook
          • Partager sur Twitter
            4 janvier 2014 à 12:34:33

            ...voir précédente réponse que j'ai édité.
            • Partager sur Facebook
            • Partager sur Twitter

            [DOM] Conversion html table to array php

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown