【问题标题】:How to increment a number inside foreach loop?如何在 foreach 循环中增加一个数字?
【发布时间】:2017-07-25 23:43:38
【问题描述】:

我想从数据库中取出一些数据并以 HTML 表格的形式显示出来。

我希望表格的第一列显示行数,例如 1,2,3,4...

这是我的 foreach 循环

$i=0;    
foreach($sql as $sql)    
{
    echo "<tr>";
        echo "<td>$i++</td>";
        echo "<td>$sql->jobseeker_name</td>";
        echo "<td>$sql->jobseeker_phone</td>";
        echo "<td>$sql->login_email</td>";
    echo "</tr>";
}

它不工作,我不知道它有什么问题。

【问题讨论】:

  • 旁注:这会在一行中生成代码。通过在 echo'd (table) 标签内连接. "\n",它将生成干净的 HTML。在查看 HTML 源代码时进行调试时,这本质上是一件好事。
  • PHP Incrementing?的可能重复
  • 更好的做法是不使用$sql 来表示每个“行”。如果您需要重新使用$sql 数组,这将成为一个问题——当循环结束时,曾经是包含行的子数组数组,然后将成为包含最后一行的子数组。
  • 这是一个演示,它揭示了您最初的问题以及增加计数器时的一些潜在问题:Demo

标签: php foreach increment


【解决方案1】:

不要在你想要回声的地方写$i++。首先回显它并在循环结束时添加$i++ 以增加值:

<?php    

$i = 1;    

foreach ($sql as $sql) {
    echo "<tr>";
    echo "<td>$i</td>";
    echo "<td>$sql->jobseeker_name</td>";
    echo "<td>$sql->jobseeker_phone</td>";
    echo "<td>$sql->login_email</td>";
    echo "</tr>";

    $i++;
}

【讨论】:

    【解决方案2】:

    字符串插值的基本版本忽略了 ++ 运算符,因为它只知道简单变量 - 请参阅 String Parsing

    如果你想要一段更好看的代码,你可以这样做:

    <!-- language: lang-php -->
    <?php    
    
    $i = 1;    
    foreach($sql as $sql): ?>
    
       <tr>
         <td><?= $i++ ?></td>
         <td><?= $sql->jobseeker_name ?></td>
         <td><?= $sql->jobseeker_phone ?></td>
         <td><?= $sql->login_email ?></td>
       </tr>
    <?php endforeach;
    

    【讨论】:

    • 啊,没看到他要从1开始,我只是在他的代码中固定了增量。关于格式,如果您正在处理一些重要的 html,如果您离开 php 上下文,则可以在 html 上获得语法突出显示等。我发现它更容易使用,尤其是在匹配标签、注意未终止的 html 属性等方面。
    【解决方案3】:

    通常,当我投票结束一个重复的问题时,我不会发布答案,但有几个机会来教育这个问题,这在单纯的 cmets 中是难以描述的。

    如果要在回显行中增加,++ 位于 $i 之前是至关重要的。如果++ 出现在$i 之后,则回显$i 的初始值,然后发生递增。

    假设我的结果集结构正确,这就是我编写 sn-p 的方式:

    代码:(Demo)

    $sql=[
        (object)['jobseeker_name'=>'A','jobseeker_phone'=>'B','login_email'=>'C'],
        (object)['jobseeker_name'=>'D','jobseeker_phone'=>'E','login_email'=>'F'],
        (object)['jobseeker_name'=>'G','jobseeker_phone'=>'H','login_email'=>'I']
    ];
    foreach($sql as $i=>$row){
        echo "<tr>";
            echo "<td>",++$i,"</td>";
            echo "<td>$row->jobseeker_name</td>";
            echo "<td>$row->jobseeker_phone</td>";
            echo "<td>$row->login_email</td>";
        echo "</tr>";
    }
    

    输出:

    <tr>
        <td>1</td>
        <td>A</td>
        <td>B</td>
        <td>C</td>
    </tr>
    <tr>
        <td>2</td>
        <td>D</td>
        <td>E</td>
        <td>F</td>
    </tr>
    <tr>
        <td>3</td>
        <td>G</td>
        <td>H</td>
        <td>I</td>
    </tr>
    

    此外,作为最佳实践:

    • 使用新的变量名来区分$sql 对象数组的每一行。如果你使用foreach($sql as $sql){,那么如果你需要再次访问$sql,你将只能访问$sql的最后一个迭代子数组,这是因为foreach循环不断地覆盖输入数组。

    • 使用逗号而不是点与 echo 连接。这是一种纳米优化,但习惯性地这样做并没有什么坏处。

    • 同样作为纳米优化问题,在所有结果为相同的。 What's the difference between ++$i and $i++ in PHP?

    【讨论】:

      【解决方案4】:

      你只需要逃避你的 i++

      echo "<td>".$i++."</td>";
      

      因为 $i++ 是 PHP 增量,所以需要对其进行解析。

      所以完整的代码应该是这样的:

      <?php    
      $i=1;    
              foreach($sql as $sql)    
              {
               echo "<tr>";
               echo "<td>".$i++."</td>";
               echo "<td>$sql->jobseeker_name</td>";
               echo "<td>$sql->jobseeker_phone</td>";
               echo "<td>$sql->login_email</td>";
               echo "</tr>";
              }
      ?>
      

      经过测试并按预期工作。这里的概念证明: https://3v4l.org/mUqZ1.

      【讨论】:

        【解决方案5】:

        试试这个代码

           $i=0;    
           foreach($sql as $sql){
              echo "<tr>";
              echo "<td>$i++</td>";
              echo "<td>$sql->jobseeker_name</td>";
              echo "<td>$sql->jobseeker_phone</td>";
              echo "<td>$sql->login_email</td>";
              echo "</tr>";
              i++;
           }
        

        【讨论】:

        • 这个 sn-p 不仅明显损坏/错误/未经测试,而且完全无法解释。即使这个答案是正确的,这篇文章也不会为页面增加新的/独特的价值,因此只会浪费研究人员的时间。这是一个帖子的极好表现,应该由 OP 或由社区以在 Stack Overflow 上策划好的内容的名义删除。
        猜你喜欢
        • 2012-03-04
        • 1970-01-01
        • 2012-11-26
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-26
        • 1970-01-01
        相关资源
        最近更新 更多