循环数组以创建不关闭的表,表和表行

时间:2012-01-10 17:14:31

标签: php html arrays loops dompdf

我目前正在开展一个项目,这需要我创建一个HTML视图,然后将其发送到DOMPDF以创建视图的PDF。

然而,构建我的视图的循环写得不是很好,当创建表和行时,关于开放HTML标记是否实际关闭似乎没有一致性,这导致我对DOMPDF的问题因为它不喜欢没有正确关闭的表格或HTML元素,下面是我正在使用的数组以及PHP循环。

数组

    Array
(
    [0] => Array
        (
            [credit_id] => 11
            [credit_heading] => Testing another new entry
            [credit_title] => Testing another new entry
            [credit_role] => Testing another new entry
            [credit_director] => Testing another new entry
            [credit_type] => long
            [credit_position] => 0
            [date_created] => 2012-01-10 17:06:24
            [candidates_candidate_id] => 54
            [rel_id] => 8
            [credits_candidate_id] => 54
            [credits_credit_id] => 11
            [category_title] => Feature Film
            [category_position] => 0
        )

    [1] => Array
        (
            [credit_id] => 1
            [credit_heading] => Test Heading 1
            [credit_title] => Test Title 1
            [credit_role] => Test Role 1
            [credit_director] => Test Director 1
            [credit_type] => long
            [credit_position] => 1
            [date_created] => 2012-01-06 17:23:41
            [candidates_candidate_id] => 54
            [rel_id] => 1
            [credits_candidate_id] => 54
            [credits_credit_id] => 1
            [category_title] => Corporate
            [category_position] => 3
        )

    [2] => Array
        (
            [credit_id] => 6
            [credit_heading] => Test Heading 4
            [credit_title] => Test Title 4
            [credit_role] => Test Role 4
            [credit_director] => Test Director 4
            [credit_type] => long
            [credit_position] => 2
            [date_created] => 2012-01-06 17:20:40
            [candidates_candidate_id] => 54
            [rel_id] => 3
            [credits_candidate_id] => 54
            [credits_credit_id] => 6
            [category_title] => Corporate
            [category_position] => 3
        )

)

代码

<?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;" class="long-entry">
                <tbody>
            <?php endif; ?> 
                    <?php if($credit['category_title'] != $oldvalue) : ?>
                    <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 else : ?>
                    <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; ?>
                          </tbody>
                          </table>
                <?php $oldvalue = $credit['category_title']; ?>
        <?php endif; ?> 

上面代码试图实现的是,虽然$credit['category_title']是新的,但我们创建了一个新表,如果在下一次迭代中它仍然是相同的,我们在表中添加一行,依此类推等等。实际上它是创建一个新表添加一个新行,然后不关闭该行或表。

预期结果

<table width="100%" cellspacing="0" cellpadding="0" border="0">
<tbody>
  <tr>
    <td width="10%"><strong>Corporate</strong></td>

    <td width="40%"><strong>Title</strong></td>

    <td width="25%"><strong>Role</strong></td>

    <td width="25%"><strong>Director</strong></td>
  </tr>

  <tr>
    <td width="10%">Test Heading 1</td>

    <td width="40%">Test Title 1</td>

    <td width="25%">Test Role 1</td>

    <td width="25%">Test Director 1</td>
  </tr>

  <tr>
    <td></td>
  </tr>

  <tr>
    <td width="10%">Test Heading 4</td>

    <td width="40%">Test Title 4</td>

    <td width="25%">Test Role 4</td>

    <td width="25%">Test Director 4</td>
  </tr>
</tbody>

实际结果

<table width="100%" cellspacing="0" cellpadding="0" border="0">
    <tbody>
      <tr>
        <td width="10%"><strong>Corporate</strong></td>

        <td width="40%"><strong>Title</strong></td>

        <td width="25%"><strong>Role</strong></td>

        <td width="25%"><strong>Director</strong></td>
      </tr>

      <tr>
        <td width="10%">Test Heading 1</td>

        <td width="40%">Test Title 1</td>

        <td width="25%">Test Role 1</td>

        <td width="25%">Test Director 1</td>
      </tr>

      <tr>
        <td></td>
      </tr>
      Test Title 4 Test Role 4 Test Director 4
    </tbody>
  </table>

我的循环应如何显示以便创建有效的HTML而不是我目前的废话?

3 个答案:

答案 0 :(得分:1)

第三个数组中的

category_title与前一个相同:“Corporate”,因此代码对第三种情况的行为不同。

答案 1 :(得分:1)

my answer question was asked previously。代码很丑,但我相信它会起作用。

然而,这个版本的问题提供了更多有关正在发生的事情的详细信息。我认为更好的解决方案是更新数据阵列以更好地反映数据的性质。所以尝试这样的事情:

<?php
$credit_categories = array();
foreach ($records as $record) :
  if (!array_key_exists($record['category_title'], $credit_categories)) :
    $credit_categories[$record['category_title']] = array(
      'category_title' => $record['category_title'],
      'category_position' => $record['category_position'],
      'credits' => array()
    );
  endif;
  $credit_categories[$record['category_title']]['credits'][] = $record;
endforeach;

foreach ($credit_categories as $credit_category) : ?>
  <table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:0px 0px 15px 0px;" class="long-entry">
    <tbody>
      <tr>
        <td width="25%"><strong><?php echo trim($credit_category['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 foreach ($credit_category['credits'] as $credit) : ?>
      <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 endforeach; // end $credit loop ?>
    </tbody>
  </table>
<?php endforeach; // end $credit_categories loop ?>

一些注意事项:

  • 我使用$records来表示您的初始数据数组,因为您没有指定变量。
  • 您可以在$credit_categories中使用任何内容作为密钥......只需确保每个类别的密钥都是唯一的,并在每条记录中表示。我更喜欢使用ID而不是文本字段,我只是使用您提供给我们的内容,而且我不确定category_position是否是唯一的。
  • 如果您更新问题以反映&#34;短&#34;信用记录我可以在必要时进一步细化代码示例,但如果&#34; long&#34;之间没有类别重叠,它可以工作。和&#34;短&#34;币。

关于数据结构的特别说明:
我已经修改了您现有的数据结构,但您应该努力在最初实现这样的结构。默认情况下,大多数MVC框架将提供规范化的数据结构(如果数据库已规范化)。如果数据库没有规范化,或者这是自定义代码,那么您的第一个任务应该是重新格式化数据数组以更好地反映规范化的数据结构。

另一方面,数据规范化并不总是必要的。此外,规范化数据的代码可能会导致大量开销,具体取决于需要处理的记录数。因此,如果规范化将使您的工作更轻松,请务必提前确定。

答案 2 :(得分:0)

这样的事情可能会这样做,虽然我承认它不是最有效的解决方案。

你可以通过使用for循环而不是foreach来稍微加快速度。

<?php
//where $creditArray is the array you're using
$tables = Array();

foreach ($creditArray as $row) {
     $tables['category_title'][] = $row;
}

foreach ($tables as $table) {
     echo '
         <table>
             <tr>
                 <td width="25%">
                     <strong>'.trim($table[0]['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>';

         foreach ($table as $row) {             
             echo'<tr>
                    <td width="25%">'.$row['credit_heading'].'</td>
                    <td width="25%">'.$row['credit_title'].'</td>
                    <td width="25%">'.$row['credit_role'].'</td>
                    <td width="25%">'.$row['credit_director'].'></td>
              </tr>';
         }

         echo "</table>";
}
?>