提问人:Anna 提问时间:11/7/2023 最后编辑:mickmackusaAnna 更新时间:11/7/2023 访问量:119
将 2 列 HTML 表格内容转换为 2d 数组
Convert 2-column HTML table contents to 2d array
问:
我正在尝试使用 PHP 将 HTML 表的单元格值解析为具有预定键的关联数组的索引数组。
$htmlContent = '<table>
<tr>
<th>test1</th>
<td>test1-1</td>
</tr>
<tr>
<th>test2</th>
<td>test2-2</td>
</tr>
</table>';
我想要这个结果:
[
['name' => "test1", 'value' => "test1-1"],
['name' => "test2", 'value' => "test2-2"],
]
我目前的结果只是:
[
['test1' => 'test1-1', 'test2' => 'test2-2']
];
这是我的编码尝试:
$DOM = new DOMDocument();
$DOM->loadHTML($htmlContent);
$Header = $DOM->getElementsByTagName('th');
$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($i = 0; $i < count($aDataTableDetailHTML); $i++)
{
for($j = 0; $j < count($aDataTableHeaderHTML); $j++)
{
$aTempData[$i][$aDataTableHeaderHTML[$j]] = $aDataTableDetailHTML[$i][$j];
}
}
$aDataTableDetailHTML = $aTempData;
unset($aTempData);
print_r($aDataTableDetailHTML);
die();
答:
-1赞
Zak
11/7/2023
#1
我会这样做,只是因为它很有趣,而且在没有 PHP DOM 解析器的情况下这样做。explode
str_replace
基本上使用 创建一个起始 Main 空数组,并循环访问它,在剥离不需要的内容(IE 和explode( '</tr>', $table );
<tr>
trimming
)
<?php
$table = <<<HTML
<table>
<tr>
<th>Name</th>
<th>Value</th>
</tr>
<tr>
<td>Name One</td>
<td>Value One</td>
</tr><tr>
<td>Name Two</td>
<td>Value Two</td>
</tr><tr>
<td>Name Three</td>
<td>Value Three</td>
</tr>
</table>
HTML;
$rows = explode( '</tr>', $table );
array_shift($rows);
array_pop($rows);
$main_arr = [];
foreach ($rows as $row){
$name = trim( str_replace(['<td>', '<tr>'], '', explode('</td>', $row)[0] ) );
$value = trim( str_replace(['<td>', '<tr>'], '', explode('</td>', $row)[1] ) );
$tmp_arr = [];
$tmp_arr['name'] = $name;
$tmp_arr['value'] = $value;
$main_arr[] = $tmp_arr;
}
print_r($main_arr);
您的输出应为:
Array
(
[0] => Array
(
[name] => Name One
[value] => Value One
)
[1] => Array
(
[name] => Name Two
[value] => Value Two
)
[2] => Array
(
[name] => Name Three
[value] => Value Three
)
)
更新
下面是执行相同操作的 PHP DOM 代码:
<?php
$DOM = new DOMDocument();
$DOM->loadHTML("<table>
<tr>
<th>Name</th>
<th>Value</th>
</tr>
<tr>
<td>Name One</td>
<td>Value One</td>
</tr><tr>
<td>Name Two</td>
<td>Value Two</td>
</tr><tr>
<td>Name Three</td>
<td>Value Three</td>
</tr>
</table>");
$main_arr = [];
$rows = $DOM->getElementsByTagName("tr");
for ($i = 0; $i < $rows->length; $i++) {
$cols = $rows->item($i)->getElementsbyTagName("td");
$tmp_arr = [];
if ($cols->item(0)->nodeValue){
$tmp_arr['name'] = $cols->item(0)->nodeValue;
$tmp_arr['value'] = $cols->item(1)->nodeValue;
$main_arr[] = $tmp_arr;
}
}
print_r( $main_arr );
评论
0赞
Anna
11/7/2023
谢谢你,先生。我可以使用 PHP DOM 吗?
0赞
Zak
11/7/2023
我添加了PHP DOM的方式。您应该编辑您的问题以指定:)
0赞
Anna
11/7/2023
你能帮我让它为这张桌子工作吗<tr><th class="col label" scope="row">test1</th><td ">test1-1</td></tr>
0赞
Anna
11/7/2023
我认为我们需要做的是如何将其添加到您的代码中$Header = $DOM->getElementsByTagName('th');
0赞
Hovercraft Full Of Eels
11/8/2023
@Zak:关于您最近对不同答案的评论,是的,这是一个 AI 生成的答案,几天后在编辑中添加了垃圾邮件链接。
0赞
mickmackusa
11/7/2023
#2
您的代码工作得太辛苦,无法尝试将列式数据保留在相应的行中。
为了简化操作,请迭代 row() 元素,然后访问给定行中的元素。<tr>
代码(演示)或(替代演示))
$dom = new DOMDocument();
$dom->loadHTML($html);
$result = [];
foreach ($dom->getElementsByTagName('tr') as $row) {
$result[] = [
'name' => $row->getElementsByTagName('th')->item(0)->nodeValue,
'value' => $row->getElementsByTagName('td')->item(0)->nodeValue,
];
}
var_export($result);
评论