我循环遍历数组并构建表。然后将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; ?>
我不能为我的生活找出哪些标签我没有关闭。如果有人能提供一些见解,那将是晶圆厂!
具体来说,循环创建显示某些标题的行,然后在类别标题更改时吐出更多行。
答案 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>
(这是一些丑陋的代码,我没有时间继续修改它,所以......社区维基以防其他人想要清理它。)