对于PHP/MySQL中的每3行

对于PHP/MySQL中的每3行,php,mysql,pdo,Php,Mysql,Pdo,我正在从MySQL检索数据,我在一个带有HTML的页面上列出了这些数据。当我循环使用MySQL时,我需要将每三次抛出放在一个单独的div中 我当前的代码可以工作,但它在一个div中打印所有行 <div class="flex"> <?php $get_plans = $database->sql("SELECT * FROM plans", array(), 'count'); if ($get_plans != 0) { $g

我正在从MySQL检索数据,我在一个带有HTML的页面上列出了这些数据。当我循环使用MySQL时,我需要将每三次抛出放在一个单独的div中

我当前的代码可以工作,但它在一个div中打印所有行

<div class="flex">
<?php 
    $get_plans = $database->sql("SELECT * FROM plans", array(), 'count');

    if ($get_plans != 0)
    {
        $get_plans = $database -> sql("SELECT * FROM plans", array(), 'rows');

        foreach ($get_plans as $plan)
        {
            $id = $plan['id'];
            $name = $plan['name'];

            echo '
                <div class="flex-33">
                    ID: '.$id.'
                    Name: '.$name.'
                </div>
            ';
        }
    }
?>
</div>


我希望生成的HTML如下所示:

如果您想以3组打印数据,您可以使用
$get\u plans
数组的索引来跟踪这一点

foreach($get_plans as $index => $plan) {
    $id = $plan['id'];
    $name = $plan['name'];
    $start_new_div = $index % 3 == 0; // Find if the current plan is 1st,4th, 7th...
    if ($start_new_div) {
        echo '<div class="flex">';
    }
    echo '
        <div class="flex-33">
            ID: '.$id.'
            Name: '.$name.'
        </div>
    ';
    $close_current_div = $index % 3 == 2 || $index == count($get_plans) - 1; // If the current plan is 3rd, 6th, 9th... or is the last plan in array
    if ($close_current_div) {
        echo '</div>';
    }
}
foreach($get\u计划为$index=>$plan){
$id=$plan['id'];
$name=$plan['name'];
$start\u new\u div=$index%3==0;//查找当前计划是否为1、4、7。。。
如果($start\u new\u div){
回声';
}
回声'
ID:“.$ID.”
名称:'.$Name'
';
$close_current_div=$index%3==2 | |$index==count($get_plans)-1;//如果当前计划是第三、第六、第九个…或者是数组中的最后一个计划
如果($close\u current\u div){
回声';
}
}
另一个选项是在
$get_plans
数组上循环,使用3个集合中的数据构造字符串,并将该字符串插入另一个数组。 然后循环这个新数组,并根据需要将字符串打印到div中

编辑:更新代码以匹配所需输出的添加屏幕截图。

我将使用:

foreach(数组块($get\u plans,3)作为$chunk){
回声';
foreach($chunk作为$plan){
回声';
回显'ID:'.$plan['ID']..;'Name:'.$plan['Name'];
回声';
}
回声';
}
结果如下:

<div class="flex">
    <div class="flex-33">ID: ID1; Name: Name1</div>
    <div class="flex-33">ID: ID2; Name: Name2</div>
    <div class="flex-33">ID: ID3; Name: Name3</div>
</div>
<div class="flex">
    <div class="flex-33">ID: ID4; Name: Name4</div>
    <div class="flex-33">ID: ID5; Name: Name5</div>
    <div class="flex-33">ID: ID6; Name: Name6</div>
</div>
<div class="flex">
    <div class="flex-33">ID: ID7; Name: Name7</div>
</div>

ID:ID1;姓名:姓名1
ID:ID2;姓名:姓名2
ID:ID3;姓名:姓名3
ID:ID4;姓名:姓名4
ID:ID5;姓名:姓名5
ID:ID6;姓名:姓名6
ID:ID7;姓名:姓名7

请参见循环中的“递增计数器”。当计数器变为3时,启动一个新的div并重置计数器。此外,无需运行两次SQL查询,
$get\u plans
的值在if中仍将保持不变。@AlexHowansky,感谢您的想法,现在尝试一下。我用一个来计数,另一个来检索信息,这就是为什么会有查询。试着用啊,没有注意到差异。不过,你可以自己运行第二个查询并使用
!空($get\u plans)
在你的条件中。从视觉上看,这是一个更干净的方法。然而,我一直不喜欢嵌套循环,因为它们往往会产生性能问题。对于较小的数据集,这几乎肯定不是问题。但要记住这一点。@maiorano84您如何像矩阵一样遍历嵌套数组?@PaulSpiegel当数组以这种格式返回时,您几乎没有选择的余地。但事实并非如此,因为数据库查询不是以嵌套格式返回的,所以我不确定你的问题与我的观点有什么关系。@maiorano84你可以选择如何编写矩阵。如果你想不惜任何代价避免嵌套循环,你会将它编码成一个线性数组(比如
[a1,b1,c1,a2,b2,c2]
,而不是
[[a1,b1,c1],[a2,b2,c2]
)。虽然在“微优化”的低级编程中有这样做的理由,但它对业务逻辑和前端编程几乎没有意义,只是使代码复杂化了。还请记住,我们在代码中都使用“隐藏”嵌套循环,因为许多函数在内部使用循环。。。。。。最大的问题是规模。这里是块的数量*块的大小,即(N/3)*3=N次迭代-因此它与数据大小成线性关系。我同意,嵌套循环需要仔细观察。但这并不意味着使用它们有任何问题。而且一个清晰的代码更容易验证,一切都很好。
<div class="flex">
    <div class="flex-33">ID: ID1; Name: Name1</div>
    <div class="flex-33">ID: ID2; Name: Name2</div>
    <div class="flex-33">ID: ID3; Name: Name3</div>
</div>
<div class="flex">
    <div class="flex-33">ID: ID4; Name: Name4</div>
    <div class="flex-33">ID: ID5; Name: Name5</div>
    <div class="flex-33">ID: ID6; Name: Name6</div>
</div>
<div class="flex">
    <div class="flex-33">ID: ID7; Name: Name7</div>
</div>