如何将表行与PHP数组合并?

时间:2014-06-04 04:11:45

标签: php html mysql codeigniter html-table

如果日期具有相同的ID,我想合并表格行。我有一些像这样的数组数据:

Array
(
    [0] => Array
        (
            [id] => 2
            [date] => 05/13/2014
            [content] => some contents 1
            [act] => act1 act2 act3
        )
    [1] => Array
        (
            [id] => 2
            [date] => 05/28/2014
            [content] => some contents 1
            [act] => act1 act2 act3
        )
    [2] => Array
        (
            [id] => 7
            [date] => 06/04/2014
            [content] => some contents 2
            [act] => act1 act2 act3
        )
)

然后我尝试将其数据分组到相同的ID:

            if($queryx = $this->mymodel->myfunction($par)){
                $datax = $queryx;
            }           
            $i = 0;
            foreach ($datax  as $idx => $val) {
                $dates[$val['id']][$i] = $val['date'].",".$val['id'];
                $contn[$val['id']][$i] = $val['content'];

                $i++;
            }

然后:

            $j = 0; $y = 0;
            echo "<table border='1'>\r\n";
            foreach ($dates as $idx => $val) {
                $tmpexp = explode(',', $val[$j]);
                echo "<tr>\r\n";
                echo "<td rowspan='".count($val)."'>".$tmpexp[0]."</td>\r\n";
                foreach ($val as $idx1 => $val1) {
                    if($idx1 > 0)
                    {
                        echo "<tr>\r\n";
                    }
                    echo "<td>".$dates[$tmpexp[1]][$y]."</td>\r\n";
                    if($idx1 < 1)
                    {
                        echo "<td rowspan='".count($val)."'>".$contn[$tmpexp[1]][$y]."</td>\r\n";                       
                        echo "<td rowspan='".count($val)."'>act1 act2 act3</td>";
                        echo "</tr>\r\n";
                    }
                    $y++;
                }
                $j++;   
            }
            echo "</table>";

如果数据至少有两个子节点没有问题,但如果日期只有一个子节点(请参见id为7的数据),则显示错误,因为未定义的偏移量。因此,如果数据上只有一个子节点,我如何添加一些处理程序。有我想要的结果:

请看这张图片:

2 个答案:

答案 0 :(得分:2)

我使用&#39;提前阅读&#39;处理嵌套循环的技术。它确实意味着&#39; foreach&#39;循环不能使用,因为下一条记录必须在处理完当前记录后立即读取。基本上,您在循环中执行的最后一个操作是在为下一次迭代设置时读取下一条记录。请注意,您永远不会测试何时打印记录,因为这取决于组的结构。代码循环与数据

中组的结构相同

A&#39; group&#39;是所有具有相同 id 的记录。

我认为&#39;内容&#39;并且&#39;行动&#39;对于组中的每个条目都是相同的。

已编辑添加&#39; rowspan&#39;适当的属性到适当的&lt; td&#39;标签。我怀疑css在这一点上可能更容易。

问题是在知道组中有多少条目之前,无法显示该组。

所以,我正在缓冲&#39;属于数组中组的所有记录。在小组的最后,它会显示相应的&#39; rowspan&#39; html中的属性。

在PHP 5.3.18上测试。它包括测试数据。

<?php /* Q24028866 */
$testData = array(array('id' => 2, 'date' => '05/13/2014', 'content' => 'some contents 2', 'act' => 'act1 act2 act3'),
                  array('id' => 2, 'date' => '05/28/2014', 'content' => 'some contents 2',  'act' => 'act1 act2 act3'),
                  array('id' => 7, 'date' => '06/04/2014', 'content' => 'some contents 7',  'act' => 'act1 act2 act3'),
                  array('id' => 8, 'date' => '06/08/2014', 'content' => 'some contents 8',  'act' => 'act1 act2 act3'),
                  array('id' => 8, 'date' => '06/09/2014', 'content' => 'some contents 8',  'act' => 'act1 act2 act3'));
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<table border='1'>
<thead><th>Date</th><th>Content</th><th>Act</th></thead>
<?php
// use 'read ahead' so there is always a 'previous' record to compare against...
$iterContents = new \ArrayIterator($testData);
$curEntry = $iterContents->current();

while ($iterContents->valid()) { // there are entries to process

    $curId = $curEntry['id'];

    // buffer the group to find out how many entries it has...
    $buffer = array();
    $buffer[] = $curEntry;

    $iterContents->next(); // next entry - may be same or different id...
    $curEntry = $iterContents->current();

    while ($iterContents->valid() && $curEntry['id'] == $curId) {  // process the group...
        $buffer[] = $curEntry; // store all records for a group in the buffer

        $iterContents->next(); // next entry - may be same or different id...
        $curEntry = $iterContents->current();
    }

     // display the current group in the buffer...
     echo '<tr>';
     echo '<td>', $buffer[0]['date'], '</td>';
     $rowspan = count($buffer) > 1 ? ' rowspan="'. count($buffer) .'"' : '';
     echo '<td', $rowspan, '>', $buffer[0]['content'], '</td>',
           '<td', $rowspan, '>', $buffer[0]['act'], '</td>';
     echo '</tr>';
     for($i = 1; $i < count($buffer); $i++) {
          echo '<tr><td>', $buffer[$i]['date'], '</td>';
          echo '</tr>';
     }
} ?>
</table>
</body>
</html>

答案 1 :(得分:1)

以下代码将为您提供您应该做的事情,

$newArray = array();        
$counter=0;        
foreach($datax  as $key=>$val){        
    $newArray[$val['id']][$counter]['date'] = $val['date'];       
    $newArray[$val['id']][$counter]['content'] = $val['content'];        
    $newArray[$val['id']][$counter]['act'] = $val['act'];        
    $counter++;        
}        
$newArray = array_map('array_values', $newArray);