来自PHP循环的格式错误的HTML

时间:2012-01-06 17:02:46

标签: php html loops foreach dompdf

我循环遍历数组并构建表。然后将HTML发送到DOMPDF。但是,如果HTML格式不正确,DOMPDF将不会创建PDF。我认为这就是我的情况。这是我的循环:

<?php foreach($credits as $credit) : ?>
        <?php if($credit['credit_type'] == "short") : ?> 
            <table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:0px 0px 15px 0px;"> 
                <tr> 
                    <td><strong><?php echo $credit['category_title']; ?></strong></td> 
                </tr> 
                <tr> 
                    <td><?php echo $credit['credit_heading']; ?></td> 
                </tr> 
            </table> 
        <?php endif; ?> 

        <?php if($credit['credit_type'] == "long") : ?>
            <?php if($credit['category_title'] != $oldvalue) : ?>
                <table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:0px 0px 15px 0px;">
                <tbody>
            <?php endif; ?> 
                <tr>
                    <?php if($credit['category_title'] != $oldvalue) : ?>
                          <td width="25%"><strong><?php echo trim($credit['category_title']); ?></strong></td>                 
                          <td width="25%"><strong>Title</strong></td>
                          <td width="25%"><strong>Role</strong></td>
                          <td width="25%"><strong>Director</strong></td>
                    <?php endif; ?>
                </tr>
                <tr>
                    <td width="25%"><?php echo $credit['credit_heading'];?></td>
                    <td width="25%"><?php echo $credit['credit_title']; ?></td>
                    <td width="25%"><?php echo $credit['credit_role']; ?></td>
                    <td width="25%"><?php echo $credit['credit_director']; ?></td>
                </tr>
                <?php if($credit['category_title'] != $oldvalue) : ?>
                    </tbody>
                    </table>
                <?php endif; ?>
                <?php $oldvalue = $credit['category_title']; ?>
        <?php endif; ?> 
    <?php endforeach; ?>

我不能为我的生活找出哪些标签我没有关闭。如果有人能提供一些见解,那将是晶圆厂!

具体来说,循环创建显示某些标题的行,然后在类别标题更改时吐出更多行。

2 个答案:

答案 0 :(得分:0)

这可能是一个简单的解决方案,但可能不是最好的解决方案:

我建议你使用PHP的Tidy类(最终你必须先安装它......)
Here is the link for the Tidy class Manual

在第一行:

ob_start();

此命令缓冲您的后续脚本输出的所有内容 下面的代码应添加到文件的末尾,或者您要显示输出的位置 它首先使用ob_get_contents()获取缓冲区,然后清除代码 请注意,您最终必须根据需要更改配置参数,实际上非常多。

$raw_output = ob_get_clean();

$config = array('indent' => true, 'output-xhtml' => true, 'wrap' => 0);
$tidy = new Tidy;
$tidy->parseString($raw_output, $config, 'utf8');
$tidy->cleanRepair();

echo $tidy;

此示例代码已由the example on php.net的原始版本修改。

希望对你有所帮助。

答案 1 :(得分:0)

在没有更多关于您的数据的情况下进行解析有点困难。例如,为什么“短期”信贷表打开并关闭记录,但“长期”信贷表是否以先前记录为条件?是因为你有一个扁平的数据结构,所以相关的数据显示为一系列连续的行?如果是这种情况,如果数据更加标准化,事情会更容易。即你可以遍历每个信用记录,然后分别通过细节。是否有可能修复您的数据结构?

分析您的代码,您的问题似乎出现在代码第二部分的逻辑中。您在循环结束时设置变量$oldvalue的值。这是在关闭表的逻辑之后。因此,如果您解析具有相同类别标题的两个记录,则第二个记录将完全输出表格行在表格之外(更不用说它也将具有完全空行)。此外,如果您在很长一段时间内有一个短信用类型,那么该表将永远不会被关闭。

话虽这么说,使用你所拥有的东西,我猜你可能需要以下内容:

// build a dummy "previous" record for the first iteration so the conditionals don't break.
<?php $previous_credit = array('credit_type'=>null,'category'=>null); ?>
<?php foreach($credits as $credit) : ?>
    <?php if($credit['credit_type'] == "short" || ($previous_credit['credit_type'] == "long" && $previous_credit['category'] != $credit['category'])) : ?>
              </tbody>
              </table>
    <?php endif; ?> 

    <?php if($credit['credit_type'] == "short") : ?> 
        <table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:0px 0px 15px 0px;"> 
            <tr> 
                <td><strong><?php echo $credit['category_title']; ?></strong></td> 
            </tr> 
            <tr> 
                <td><?php echo $credit['credit_heading']; ?></td> 
            </tr> 
        </table> 
    <?php endif; ?> 

    <?php if($credit['credit_type'] == "long") : ?>
        <?php if($credit['category_title'] != $previous_credit['category_title']) : ?>
            <table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:0px 0px 15px 0px;">
            <tbody>
            <tr>
                <td width="25%"><strong><?php echo trim($credit['category_title']); ?></strong></td>                 
                <td width="25%"><strong>Title</strong></td>
                <td width="25%"><strong>Role</strong></td>
                <td width="25%"><strong>Director</strong></td>
            </tr>
        <?php endif; ?> 
            <tr>
                <td width="25%"><?php echo $credit['credit_heading'];?></td>
                <td width="25%"><?php echo $credit['credit_title']; ?></td>
                <td width="25%"><?php echo $credit['credit_role']; ?></td>
                <td width="25%"><?php echo $credit['credit_director']; ?></td>
            </tr>
    <?php endif; ?>
    <?php $previous_credit = $credit; ?>
<?php endforeach; ?>

<!-- one last table close for the last record -->
</tbody></table>

(这是一些丑陋的代码,我没有时间继续修改它,所以......社区维基以防其他人想要清理它。)