我需要从一个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"]
]
型
4条答案
按热度按时间mcdcgff01#
我修改了很多代码来简化它,这分为两个阶段,第一个阶段是提取
<tr>
元素,并在每行中构建所有<td>
元素的数组-将结果存储到$rows
中。第二种方法是通过循环遍历第一行,然后使用
array_column()
从所有行中提取相应的数据来垂直捆绑数据。字符串
根据测试数据,...
型
ogsagwnx2#
我添加了一些额外的代码,它将把
$aDataTableDetailHTML
数组分成两个值,然后添加键,在本例中是“header”。字符串
这给了我输出:
型
似乎和你要找的东西吻合。希望能帮上忙。
我还测试了一些额外的值,模式继续进行。
rdrgkggo3#
我知道这个answere来得很晚,但我已经为此开发了一个包。它被称为TableDude。
对于你的情况,这个PHP代码段将工作。
字符串
t98cgbkg4#
若要维护行和单元格之间的父子关系,请在
tr
标记的上下文中访问td
标记。通过将第一级键与第二级键交换来实现数据结构的转置。
产品编号:(Demo)
字符串