【问题标题】:Loading data from MySQL to table horizontally将数据从 MySQL 水平加载到表中
【发布时间】:2018-10-11 04:40:49
【问题描述】:

我正在从 MySQL 数据库加载一些数据,它看起来像这样:

| Gray |  S  |
| Gray |  M  |
| Gray |  L  |
| Red  |  S  |
| Red  |  M  |
| Red  |  L  |

我想像这样水平地将数据加载到我的表格中,按颜色分组:

| Gray |  S  |  M  |  L  |  XL  |
| Red  |  S  |  M  |  L  |  XL  |

这是我的代码:

<table>
<?php foreach($products as $product) {?>
    <tr>
    <td><?php echo $product['color'];?></td>
    <td><?php echo $product['size'];?></td>
    </tr>       
<?php   }
?>      
</table>

问题:如何将数据加载到我的表格中,每行按颜色分组?我可以在没有单独的 MySQL 查询的情况下执行此操作吗?

【问题讨论】:

  • 老实说,这是一个演示问题,最好在 PHP 中处理,而不是 MySQL。
  • 我也这么觉得,或许你有一些管理思路?

标签: php html-table


【解决方案1】:

一点点手动迭代会是你的朋友......

$DatabaseResult = [ ['Gray','S'],['Gray','M'],['Gray','L'],['Red','S'],['Red','M'],['Red','L'] ];

$Grouped = array_fill_keys( array_unique( array_column( $DatabaseResult, 0 ) ), array() );

foreach( $DatabaseResult as $row )
{
  $Grouped[ $row[0] ][] = $row[1];
}

print_r( $Grouped );

//Array
//(
//    [Gray] => Array
//        (
//            [0] => S
//            [1] => M
//            [2] => L
//        )
//
//    [Red] => Array
//        (
//            [0] => S
//            [1] => M
//            [2] => L
//        )
//)

然后您将创建两个循环,外部是您的“颜色”行,内部是您的“大小”列

<table border="1">
  <?php foreach( $Grouped as $colour => $sizes ) {?>
    <tr>
      <td><?php echo $colour;?></td>
      </td>
      <?php foreach($sizes as $size) {?>
        <td><?php echo $size;?></td>
      <?php } ?>
    </tr>
  <?php } ?>
</table>

此外,如果您需要打印可用性尺寸表,您可以这样做...

$Products = [
  ['color'=>'Gray','size'=>'S','quantity'=>2],
  ['color'=>'Gray','size'=>'M','quantity'=>4],
  ['color'=>'Gray','size'=>'L','quantity'=>7],
  ['color'=>'Red','size'=>'S','quantity'=>8],
  ['color'=>'Red','size'=>'M','quantity'=>6],
  ['color'=>'Red','size'=>'XXL','quantity'=>1],
];

// Helper function to locate products from the array
function SearchProductArray( $products, $color, $size )
{
  foreach( $products as $product )
  {
    if( $product[ 'color' ] == $color and $product[ 'size' ] == $size )
    {
      return $product;
    }
  }
  return false;
}

// Locate all the unique Values
$Colours = array_unique( array_column( $Products, 'color' ) );
$Sizes = ['SS','S','M','L','XL','XXL'];

?>

<table border="1">
  <tr>
    <td>Colour</td>
    <?php foreach( $Sizes as $Size ) {?>
      <td><?php echo $Size;?></td>
    <?php } ?>
  </tr>
  <?php foreach( $Colours as $Colour ) {?>
    <tr>
      <td><?php echo $Colour;?></td>
      <?php foreach( $Sizes as $Size ) { $Product = SearchProductArray( $Products, $Colour, $Size ); ?>
        <td><?php echo ( $Product ) ? $Product['quantity'] : '&nbsp'; ?></td>
      <?php } ?>
    </tr>
  <?php } ?>
</table>

【讨论】:

  • 非常好,它适用于您的数组数据,但我如何使用 $product['color'] 而不是 'Gray' 或 'Red' 加载它?
  • 只需将$row[0] 更改为$row['color']
  • 你能再帮我一点吗?如何在大小值旁边添加 $row['quantity'],它显示“是”
  • @JoeDoe 我已经更新了答案的第二部分。我添加了一个辅助函数SearchProductArray 来简化产品定位。
【解决方案2】:

你可以在php中试试。将结果转换为数组并使用 for 循环而不是 foreach 循环,您可以将第一列作为一行循环,然后使用计数器将第二列作为一行循环。

【讨论】:

    【解决方案3】:

    要从 MySQL 获取结果,我们可以这样做:

    SELECT t.color
         , MAX(IF(t.size='S' ,t.size,NULL)) AS size_s
         , MAX(IF(t.size='M' ,t.size,NULL)) AS size_m
         , MAX(IF(t.size='L' ,t.size,NULL)) AS size_l
         , MAX(IF(t.size='XL',t.size,NULL)) AS size_xl
      FROM mytable t
     WHERE ...
     GROUP BY t.color
    

    请注意,查询仅预期大小的特定值。如果我们在 MySQL 表中有大小“XS”或“XXL”,则此查询将忽略这些值。

    因此,这种方法最适合具有静态、明确定义的域(有效值列表)的列。

    为了让这种方法更加动态,并返回如图所示的结果集,我们需要一个预查询来获取值列表,然后动态构造要执行的 SQL 语句。

    但是一旦我们走上这条路,最好只用一个简单的查询从 MySQL 中检索值,然后在客户端中进行处理以将行“透视”到列中以进行表示.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-30
      • 2011-10-30
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多