php 将HTML表格数据转换为转置的2D数组

q0qdq0h2  于 2023-11-16  发布在  PHP
关注(0)|答案(4)|浏览(177)

我需要从一个HTML表中抓取数据,并将列数据定向为二维数组的行。
我的代码没有显示正确的结构。
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"]
]

mcdcgff0

mcdcgff01#

我修改了很多代码来简化它,这分为两个阶段,第一个阶段是提取<tr>元素,并在每行中构建所有<td>元素的数组-将结果存储到$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"]]

ogsagwnx

ogsagwnx2#

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

//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" ] ]


似乎和你要找的东西吻合。希望能帮上忙。
我还测试了一些额外的值,模式继续进行。

rdrgkggo

rdrgkggo3#

我知道这个answere来得很晚,但我已经为此开发了一个包。它被称为TableDude
对于你的情况,这个PHP代码段将工作。

// 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")
)
*/

字符串

t98cgbkg

t98cgbkg4#

若要维护行和单元格之间的父子关系,请在tr标记的上下文中访问td标记。
通过将第一级键与第二级键交换来实现数据结构的转置。
产品编号:(Demo

$dom = new DOMDocument();
$dom->loadHTML($html);
$result = [];
foreach ($dom->getElementsByTagName('tr') as $i => $row) {
    foreach ($row->getElementsByTagName('td') as $c => $cell) {
        $result[$c][$i] = $cell->nodeValue;
    }
}
var_export($result);

字符串

相关问题