对 CodeIgniter 查询结果进行分块并转置以在垂直 HTML 列中打印值

问题描述 投票:0回答:3

我有一个 CodeIgniter 查询结果,有 28 条记录。

我的意思是根据这些记录创建一个 HTML 表,并从左到右按列打印数据。

换句话说,我想要制作7行4列。

我的伪代码是这样的:

<td colspan="4">
   <?php
        foreach ($damage_codes as $row) {
            // Create a column. <td>
            // create a row <tr>
            // When this column have four row, create a next column  again.
            // So on, so on 

              echo  . $row->DAMAGE_ID . " " . $row->NAMA_DAMAGE ;
        }
        ?>
    </td>

这是我现在的代码:

<?php 
    $i = 0;
    foreach ($damage_codes as $row) : ?>
        <?= ($i % 4 == 0) ? "<tr>" : false; ?>
        <?= "<td>[".$row->DAMAGE_ID . "]" . $row->NAMA_DAMAGE . "</td>"; ?>
        
    <?php 
    $i++;
    endforeach;
    echo "</tr>"?>

输出如下:

| 1  | 2  | 3  | 4  |
| 5  | 6  | 7  | 8  |
| 9  | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 |

我怎样才能做到这样?

| 1 | 8  | 15 | 22 |
| 2 | 9  | 16 | 23 |
| 3 | 10 | 17 | 24 |
| 4 | 11 | 18 | 25 |
| 5 | 12 | 19 | 26 |
| 6 | 13 | 20 | 27 |
| 7 | 14 | 21 | 28 |
php html arrays codeigniter transpose
3个回答
1
投票

只需在 foreach 循环之外使用计数器变量来跟上它。

类似这样的:

<table>
    <?php 
        $i = 0;
       foreach ($damage_codes->result() as $row): 
    ?>
          <?= ($i % 4 == 0) ? "<tr>" : false; ?>
                <?= "<td>".$row->DAMAGE_ID . " " . $row->NAMA_DAMAGE . "</td>;
          <?= ($i % 4 == 0) ? </tr>" : false; ?>
     <?php
          $i++;
       endforeach;
     ?>
</table>

0
投票

也许这会对你有一点帮助

更新版本:

$arr = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21);

$md_arr = array();
$cols = 4;
$i = 0;
$col = 0;
$row = 0;

// first convert your single array to a multidimensional one
foreach ($arr as $k=>$v) {

    $i++;
    $md_arr[$row][$col] = $v;
    $col++;

    if( $i % $cols == 0 ){
        $row++;
        $col = 0;
    } 

}

function transpose($array) {
    array_unshift($array, null);
    return call_user_func_array('array_map', $array);
}

// then transpose your new multi array
$md_arr = transpose( $md_arr );

// last render the table with the transposed array
echo "<table>";
foreach ($md_arr as $k=>$v) {
    echo "<tr>";
    foreach ($v as $kk=>$vv) {
        echo "<td>";
        echo $md_arr[ $k ][ $kk ];
        echo "</td>";
    }
    echo "</tr>";
}
echo "</table>";

0
投票

虽然从技术上讲,在循环时手动管理索引会提高性能,并且因为您的结果将是已知的小尺寸,但我建议简单地分块,然后转置数据。创建一个库方法或辅助函数来执行此重组操作(它不属于控制器、模型或视图层),然后视图可以迭代完全准备好的有效负载。

代码:(演示

$damage_codes = range(1, 28);

$result = array_map(null, ...array_chunk($damage_codes, 7));

var_export($result);

输出:

array (
  0 => 
  array (
    0 => 1,
    1 => 8,
    2 => 15,
    3 => 22,
  ),
  1 => 
  array (
    0 => 2,
    1 => 9,
    2 => 16,
    3 => 23,
  ),
  2 => 
  array (
    0 => 3,
    1 => 10,
    2 => 17,
    3 => 24,
  ),
  3 => 
  array (
    0 => 4,
    1 => 11,
    2 => 18,
    3 => 25,
  ),
  4 => 
  array (
    0 => 5,
    1 => 12,
    2 => 19,
    3 => 26,
  ),
  5 => 
  array (
    0 => 6,
    1 => 13,
    2 => 20,
    3 => 27,
  ),
  6 => 
  array (
    0 => 7,
    1 => 14,
    2 => 21,
    3 => 28,
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.