繁体   English   中英

使用PHP将MySQL结果分成3列

[英]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,但这是很多循环,所以这不是我的首选方法。

  1. 以您希望其开头的格式获取数据,例如

    “选择IF(id%3 = 0,title,null)AS col_one,如果IF(id%3 = 1,title,null)AS col_two ...

那么您将获得一个包含三列的结果,您可以快速遍历每一列,或者对每列使用更具吸引力的内容(例如数组映射)将其快速格式化为li的html字符串等

显然,这不是有关如何执行此操作的教程,而是可以指导您明智的选择。

另外,植入一些PDO,如果您不这样做,这里的人会与您相处的(而且没有理由不使用它)

我现在找到了最佳解决方案:

  1. 将我的数据库查询结果保存到数组中
  2. 使用array_chunk将结果分成3个
  3. 分别遍历每一列和每个数组

例:

<?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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM