Конвертировать таблицу HTML в массив столбцов PHP - PullRequest
0 голосов
/ 06 ноября 2018

Как преобразовать таблицу 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"]
]

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Я изменил большую часть кода, чтобы (надеюсь) упростить его. Это работает в два этапа, первый - извлечь элементы <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"]]
0 голосов
/ 06 ноября 2018

Я добавил дополнительный код, он разделит массив $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" ] ]

Что, кажется, соответствует тому, что вы были после. Надеюсь, что это поможет.

Я также проверил некоторые дополнительные значения, и образец продолжал нести.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...