我从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查询的情况下执行此操作吗?
答案 0 :(得分:2)
一点点手动迭代就是你的朋友......
$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
// )
//)
然后你会创建两个循环,外部是你的&#34;颜色&#34;排在内部是你的&#34;尺寸&#34;柱
<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'] : ' '; ?></td>
<?php } ?>
</tr>
<?php } ?>
</table>
答案 1 :(得分:1)
你可以试试php。将结果转换为数组并使用for循环而不是foreach循环,您可以使用计数器循环第一列作为行,然后将第二列作为行循环。
答案 2 :(得分:1)
要从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中检索它们,并在客户端进行处理,将行“转移”到列中进行演示