0

我正在使用函数从 XML (即来自外部源,我无法在输入 xml 中进行任何更改)SimpleXMLElement()创建一个表。它很好地创建了表格,但是,如果您仔细查看$data某些行中的输入 xml 跳过了一些数字(例如: _x0034_在第一行),我需要在colspan跳过 col 时将正确的位置添加到位置,可以是一个或两个等

例如:如果我跳过 col4 需要添加colspan="2"col3

<?php $data= "<tableDOC>
<Table8>
    <_x0031_>9</_x0031_>
    <_x0032_>101970</_x0032_>
    <_x0033_>100000</_x0033_>
    <_x0035_>36000</_x0035_>
    <_x0036_>0</_x0036_>
    <_x0037_>0</_x0037_>
    <_x0038_>0</_x0038_>
  </Table8>
  <Table8>
    <_x0031_>10</_x0031_>
    <_x0033_>100000</_x0033_>
    <_x0034_>22500</_x0034_>
    <_x0035_>40000</_x0035_>
    <_x0036_>100000</_x0036_>
    <_x0037_>22500</_x0037_>
    <_x0038_>40000</_x0038_>
  </Table8>
 <Table8>
    <_x0031_>10</_x0031_>
    <_x0032_>113300</_x0032_>
    <_x0033_>100000</_x0033_>
    <_x0034_>22500</_x0034_>
    <_x0035_>40000</_x0035_>
    <_x0038_>40000</_x0038_>
  </Table8>
</tableDOC>";

$books = new SimpleXMLElement($data);

echo <<<EOF
<table border="1" width="100%" cellpading="0" cellspacing="0">
EOF;
foreach($books as $Table8) 
{

echo "<tr>";
       echo "<td>".$Table8->_x0031_."</td>"; 
       echo "<td>".$Table8->_x0032_."</td>";
       echo "<td>".$Table8->_x0033_."</td>";
       echo "<td>".$Table8->_x0034_."</td>";
       echo "<td>".$Table8->_x0035_."</td>"; 
       echo "<td>".$Table8->_x0036_."</td>"; 
       echo "<td>".$Table8->_x0037_."</td>"; 
       echo "<td>".$Table8->_x0038_."</td>"; 
echo "</tr>";
 }
echo '</table>'; ?>

此处的工作示例http://codepad.org/bsb8x19m

上面的例子产生了一个像这样的表http://jsfiddle.net/MwyZT/

但我的预期结果需要是这样的(宽度适当的colspan)http://jsfiddle.net/MUX54/

4

1 回答 1

1

诀窍是跟踪行号:(
如果最后一个 colnumber < 38 用 注释,则编辑代码以制作正确的表// edit

$xml = simplexml_load_string($x); // assume XML in $x
$output = "<table border=\"1\" width=\"100%\">";

foreach ($xml->Table8 as $row) {
    $lastcolnumber = 30; // edit
    $output .= "<tr>";
        $max = $row->children()->count(); // edit
        $count = 1; // edit

    foreach ($row->children() as $col => $value) {
        $colnumber = intval(filter_var($col, FILTER_SANITIZE_NUMBER_INT));
        $step = $colnumber - $lastcolnumber;
        if ($count == $max && $colnumber < 38) $step = 38 - $lastcolnumber; // edit
        $lastcolnumber = $colnumber;
        $count++; // edit   

        if ($step > 1) $colspan = " colspan=\"$step\""; 
        else $colspan = "";
        $output .= "<td$colspan>$value</td>";
    } // $value

    $output .= "</tr>";
} // $row

$output .= "</table>"; // now, $output contains the HTML code for the table

评论:
1. 第一个foreach循环正在抓取一个<Table8>节点及其子节点,这是一个表格行
2. 第二个foreach循环正在抓取它的子节点,这些是表格单元格
3. 单元格的列号以它们的名称编码,<_x0031_>是列31、filter_var()仅用于提取数字,intval()转换为int.
4.计算从一到下一列号的步长:如果大于1,在标签中添加一个colspan属性。 5. 编辑后的代码正在跟踪内循环中的单元格数:如果最后一个单元格被处理,则重新计算。 <td>$output
foreach$colnumber < 38$step

看到它工作:http ://codepad.viper-7.com/HRz8p6

于 2013-08-18T20:57:31.770 回答