【问题标题】:Splitting MySQL results into 3 columns with PHP使用 PHP 将 MySQL 结果拆分为 3 列
【发布时间】:2019-02-27 14:28:38
【问题描述】:

我正在尝试将我的数据库中的结果输出到 3 列(不同数量的记录),但没有任何成功。我找到了一些解决方案(this 是最接近的),但它们中的大多数都使用表格标记水平工作,而我的标记已经是列。

代码结构如下:

<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 结构更容易做到这一点,但由于布局的原因,它需要在列中垂直排列,因为各个结果是可以扩展/收缩的不同高度的框,所以在结构上它需要保持这样。

【问题讨论】:

  • 您想知道如何在 3 列网格上输出数组。这里不需要包含任何sql。
  • 我想我只会有一系列 li 元素,然后使用 css 进行格式化 - 在后台使用 masonry/packery (packery.metafizzy.co) 之类的东西 - 但我不这样做这种事情很多,所以我可能有点脱节。
  • @Strawberry 好的 - 考虑到我正在尝试做的事情的明显复杂性,最好从布局的角度来解决这个问题。那个砌体例子看起来不错,谢谢。

标签: php


【解决方案1】:

这里是一个例子。我在循环之前打开一个 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>" ;
?>

【讨论】:

  • 谢谢你,不过如果我理解正确的话,这会每列只输出 3 个结果吗?结果的数量会有所不同,因此我正在寻找它将总数拆分为 3 列,这可以是任意数量的结果。
  • 是的,您可以根据需要更换 3 个。
  • 抱歉,这产生了我目前遇到的同样问题 - 当结果更多时,它只会创建更多列。
  • 你能发布你想要的结果吗?
  • 我现在已经发布了解决方案 - 想要的结果是我原始问题中的 HTML,保留 3 列并有不同数量的结果。
【解决方案2】:

最好的办法是在您尝试回显任何 html 之前以您想要的结构获取数据。因为你已经关闭了 cols,所以一旦你完成了这个,你就不能真正回到第一个 col。

我想到的一些方法是:

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. 以您希望它开头的格式获取数据,例如

    "SELECT IF(id%3 = 0,title,null) AS col_one, IF(id%3 = 1,title,null) AS col_two ...等

那么你将得到一个包含三列的结果,你可以快速迭代每一列,或者使用更有吸引力的东西,比如每个列的数组映射,以快速将其格式化为 li 等的 html 字符串等

显然,这不是一个关于如何做的教程,而是为你指明一个明智的方向。

另外,植入一些 PDO,如果你不这样做,这里的人会生你的气(而且没有真正的借口不使用它)

【讨论】:

    【解决方案3】:

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

    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>";
    }            
    
    ?> 
    

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多