【问题标题】:Convert HTML Table to Column Array PHP将 HTML 表转换为列数组 PHP
【发布时间】:2019-04-10 03:03:45
【问题描述】:

如何将 HTML 表格转换为 PHP 数组列? 有一个HTML表格,有一个php代码,但我不能得到想要的结果。

下面是我的例子和想要的结果。

我写了 php 代码,但它没有显示正确的结构。

HTML 表格:

<html>
<head>
</head>
<body>
<table>
<tbody>
    <tr>
        <td>header</td>
        <td>header</td>
    <td>header</td>
</tr>
<tr>
    <td>content</td>
    <td>content</td>
    <td>content</td>
</tr>
<tr>
<td>test</td>
<td>test</td>
<td>test</td>
</tr>
</tbody>
</table>
</body>
</html>

PHP 代码:

$DOM = new \DOMDocument();
$DOM->loadHTML($valdat["table"]);

$Header = $DOM->getElementsByTagName('tr')->item(0)->getElementsByTagName('td');
$Detail = $DOM->getElementsByTagName('td');

//#Get header name of the table
foreach($Header as $NodeHeader) 
{
    $aDataTableHeaderHTML[] = trim($NodeHeader->textContent);
}
//print_r($aDataTableHeaderHTML); die();

//#Get row data/detail table without header name as key
$i = 0;
$j = 0;

foreach($Detail as $sNodeDetail) 
{
    $aDataTableDetailHTML[$j][] = trim($sNodeDetail->textContent);
    $i = $i + 1;
    $j = $i % count($aDataTableHeaderHTML) == 0 ? $j + 1 : $j;
}
//print_r($aDataTableDetailHTML); die();

//#Get row data/detail table with header name as key and outer array index as row number
for($j = 0; $j < count($aDataTableHeaderHTML); $j++)
{
    for($i = 1; $i < count($aDataTableDetailHTML); $i++)
    {

        $aTempData[][$aDataTableHeaderHTML[$j]][] = $aDataTableDetailHTML[$i][$j];
    }
}

$aDataTableDetailHTML = $aTempData;
echo json_encode($aDataTableDetailHTML);

我的结果:

[{"header":["content"]},{"header":["test"]},{"header":["content"]},{"header":["test"]},{"header":["content"]},{"header":["test"]}]

我们需要这样的结果:

[
   ["header","content","test"],
   ["header","content","test"],
   ["header","content","test"]
]

【问题讨论】:

    标签: php html arrays json html-table


    【解决方案1】:

    我知道这个答案来晚了,但我为此目的开发了一个包。它被称为TableDude

    对于你的情况,这个 PHP sn-p 可以工作。

    
    // Including TableDude
    require __DIR__ . "/../src/autoload.php";
    
    $html = "<html>
    <head>
    </head>
    <body>
    <table>
    <tbody>
        <tr>
            <td>header</td>
            <td>header</td>
        <td>header</td>
    </tr>
    <tr>
        <td>content</td>
        <td>content</td>
        <td>content</td>
    </tr>
    <tr>
    <td>test</td>
    <td>test</td>
    <td>test</td>
    </tr>
    </tbody>
    </table>
    </body>
    </html>";
    
    // Parses the HTML to array table
    $simpleParser = new \TableDude\Parser\SimpleParser($html);
    $parsedTables = $simpleParser->parseHTMLTables();
    
    if(count($parsedTables) > 0)
    {
        $firstTable = $parsedTables[0];
        $tableOrderedByColumn = \TableDude\Tools\ArrayTool::swapArray($firstTable);
        print_r($tableOrderedByColumn);
    }
    
    // This would output
    /*
    array(
       array("header", "content", "test"),
       array("header", "content", "test"),
       array("header", "content", "test")
    )
    */
    
    

    【讨论】:

      【解决方案2】:

      我已经更改了很多代码以(希望)简化它。这分两个阶段进行,首先是提取&lt;tr&gt; 元素并构建每行中所有&lt;td&gt; 元素的数组 - 将结果存储到$rows

      其次是通过循环遍历第一行然后使用array_column()从所有行中提取相应的数据来垂直捆绑数据...

      $trList = $DOM->getElementsByTagName("tr");
      $rows = [];
      foreach ( $trList as $tr )  {
          $row = [];
          foreach ( $tr->getElementsByTagName("td") as $td )  {
              $row[] = trim($td->textContent);
          }
          $rows[] = $row;
      }
      
      $aDataTableDetailHTML = [];
      foreach ( $rows[0] as $col => $value )  {
          $aDataTableDetailHTML[] = array_column($rows, $col);
      }
      echo json_encode($aDataTableDetailHTML);
      

      用测试数据给出的...

      [["header","content","test"],["header","content","test"],["header","content","test"]]
      

      【讨论】:

        【解决方案3】:

        我添加了一些额外的代码,它将$aDataTableDetailHTML 数组分成两个值,然后添加键,在本例中为“标题”

        //There are two elements that are not "header"
        $aDataTableDetailHTML = array_chunk($aTempData, 2);
        
        //For every item in the array
        foreach($aDataTableDetailHTML as $key=>$tag){
            //Dynamically get the name, in this case, "header"
            $tagName = array_keys( $tag[0] )[0];
        
            //Start an array containing the tagname ("header")
            $tagOut = array( $tagName );
        
            //Add the two values onto the array
            $tagOut[] = $tag[0][$tagName][0];
            $tagOut[] = $tag[1][$tagName][0];
        
            //Drop the keys from the array
            $aDataTableDetailHTML[$key] = array_values( $tagOut );
        }
        
        echo json_encode($aDataTableDetailHTML);
        

        这给了我输出:

        [ [ "header", "content", "test" ], [ "header", "content", "test" ], [ "header", "content", "test" ] ]
        

        这似乎与您所追求的相符。希望这会有所帮助。

        我还测试了一些附加值,并且该模式继续进行。

        【讨论】:

        • 这不适用于更简单的表格。示例:1 2 3 - 标题 1 2 3 - 正文
        猜你喜欢
        • 1970-01-01
        • 2015-10-31
        • 2020-02-28
        • 2015-08-29
        • 2016-05-06
        • 2021-04-05
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        相关资源
        最近更新 更多