[英]Splitting MySQL results into 3 columns with PHP
我正在尝试将数据库中的结果输出到3列(各种记录数)中,但是没有成功。 我发现了一些解决方案( 这是最接近的),但是大多数解决方案都可以与表标记一起水平使用,而我的标记已经是列。
代码结构如下:
<div class="grid">
<div class="col">
result 1
result 2
result 3
</div>
<div class="col">
result 4
result 5
result 6
</div>
<div class="col">
result 7
result 8
result 9
</div>
</div>
我当前的PHP尝试如下:
echo "<div class='col'>";
$result = $mysqli->query("SELECT * FROM stories ORDER BY RAND()");
$resultCount = $result->num_rows;
$i = 0;
while($row = $result->fetch_assoc())
{
if($i > 0 AND $i % 3 == 0) {
echo "</div><div class='col'>";
}
?>
<div class="result">
content here
</div>
<?php
$i++;
}
echo "</div>";
这适用于我的9个结果示例,但是一旦有10个结果,它就会创建第4列,这会破坏布局。 我告诉我为什么要结束并每3个结果开始一个新列而不停止。
我知道我需要对记录总数进行处理,然后将其分成3个,但这就是我要坚持的地方。 如果有余数(例如10),我想我希望它位于第一列,因此结果集将被分成4/3/3。
想法/建议深表感谢!
注意:我曾经考虑过使用不同的HTML结构执行此操作会更容易,但是由于布局的原因,它需要垂直放置在列中,因为各个结果的高度框会发生变化,可以扩展/收缩,因此在结构上需要保持不变像这样。
这里举个例子。 我在循环之前打开一个div,然后在循环之后关闭它,并用3行填充它,然后关闭并再次打开。
希望能帮助到你。
<?php
$result = $mysqli->query("SELECT * FROM stories ORDER BY RAND()");
$resultCount = $result->num_rows;
$totalCols = 0;
$out = "<div class='col'>";
while ($row = $result->fetch_assoc()) {
if ($totalCols ==3) {
$out .= "</div><div>"
$out .= $row['col'];
$totalCols = 1;
}else{
$out .= $row['col'];
$totalCols ++;
}
}
$out .= "</div>";
print "<div class='grid'> $out </div>" ;
?>
最好的办法是在尝试回显任何html之前获取所需结构中的数据。 因为您已经关闭了列,所以一旦完成此操作,您将无法真正返回第一个列。
想到的一些方法是:
1.将所有数据存储在单个数组中(例如fetchAll)-我不记得使用Mysqli的方法(无论如何,您都应该使用PDO,但我会在这里为您省去讲课的费用),然后计算结果。 然后,您可以在到达特定点时开始新的一列,例如
$i = 0;
foreach($result as $key => $value) {
$i++;
if($i >= sizeof($result)/3){$i = 0; echo '</div>'...}
....your Code here
}
您也可以将其拆分为3个单独的数组,然后在每个数组上进行迭代以获取cols,但这是很多循环,所以这不是我的首选方法。
以您希望其开头的格式获取数据,例如
“选择IF(id%3 = 0,title,null)AS col_one,如果IF(id%3 = 1,title,null)AS col_two ...
那么您将获得一个包含三列的结果,您可以快速遍历每一列,或者对每列使用更具吸引力的内容(例如数组映射)将其快速格式化为li的html字符串等
显然,这不是有关如何执行此操作的教程,而是可以指导您明智的选择。
另外,植入一些PDO,如果您不这样做,这里的人会与您相处的(而且没有理由不使用它)
我现在找到了最佳解决方案:
例:
<?php
$result = $mysqli->query("SELECT * FROM stories");
while($row = $result->fetch_array())
{
$rows[] = $row;
}
$lists = array_chunk($rows, ceil(count($rows) / 3));
foreach ($lists as $column) {
echo "<div class='column'>";
foreach ($column as $item) {
echo $item
}
echo "</div>";
}
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.