0

次のようなDOMDocumentとしてテーブルを取得しました。

 name   | user      | comment
 -----------------------------
 Test   | user1     | Line 1
 Abc    | user2     | Line 1
        |           | Line 2
 Test2  | user3     | Line 1
 Test3  | user3     | Line 1
        |           | Line 2
        |           | Line 3

ご覧のとおり、コメントが複数のテーブル行に折り返されることがあります。(コメントが長い場合はどうやら)
これらの折り返しが発生すると、コメント1を除くすべてのフィールドが空になります。

これらのラップされたコメントをマージして出力するにはどうすればよいですか?

私は現在、次のように出力しています。

foreach ($xml->getElementsByTagName('table')->item(1)->getElementsByTagName('tr') as $row) {
        echo "<tr>";
        foreach ($row->getElementsByTagName('td') as $column) {
            echo "<td>" . $column->textContent . "</td>";
        }
        echo "</tr>";
    }
}
4

1 に答える 1

1

次の行に何が含まれているかを知る前に、各行を出力しています。別のアプローチは、各行を配列に格納することです。これにより、次の行が特定の条件 (ラッピングなど) を満たす場合に前の行を修正できます。結果の配列は、処理後に HTML テーブルとして出力できます。

このようなもの(テストされていません):

// build array
$rows = array();
$xmlRows = $xml->getElementsByTagName('table')->item(1)->getElementsByTagName('tr');
foreach ($xmlRows as $xmlRow) {
    $emptyFields = 0;
    $row = array();
    $xmlColumns = $xmlRow->getElementsByTagName('td');
    foreach ($xmlColumns as $xmlColumn) {
        if (empty($xmlColumn->textContent)) { // count empty fields
            $emptyFields++;
        }
        $row[] = $xmlColumn->textContent;
    }
    if ($emptyFields >= 2) { // detect if wrapping has occurred
        $lastRow = array_pop($rows); // remove last row from array
        $lastRow[2] .= $row[2]; // update last row with wrapped data
        $row = $lastRow; // use newly merged row
    }
    $rows[] = $row;
}
// output array
foreach ($rows as &$row) {
    $row = '<td>' . implode('</td><td>', $row) . '</td>';
}
echo '<table><tr>' . implode('</tr><tr>', $rows) . '</tr></table>';
于 2012-10-05T19:33:40.593 に答える