将 2 列 HTML 表格内容转换为 2d 数组

问题描述 投票:0回答:2

我正在尝试使用 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();
php html arrays html-parsing domdocument
2个回答
0
投票

您的代码工作得太辛苦,无法尝试将柱状数据保留在相应的行中。

为了让事情变得更容易,迭代行 (

<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);

-1
投票

我这样做只是因为使用

explode
str_replace
很有趣——无需 PHP DOM 解析器..

基本上使用

explode( '</tr>', $table );
创建一个起始的 Main 空数组,并循环遍历它,在剥离不需要的内容后向其中添加临时数组(IE
<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 );
© www.soinside.com 2019 - 2024. All rights reserved.