在 php 和 mysqli 中为一个数组创建多个 while 循环


Creating multiple while loops for one array in php and mysqli

所以我正在尝试创建一个列表,该列表将显示属于某个区域的所有用户。为此,我尝试使用一个 while 循环,它将显示所有名称。请参阅下面的代码:

<h2>Region 2:</h2>
<?php 
          //REGION 2:
          $result = mysqli_query($ExampleDB,"SELECT * FROM members WHERE region=2 ORDER BY user DESC");
            while($row = mysqli_fetch_array($result))
              {
              echo "</br>Position 2: ";
              if ($row['position']==2){
              echo"".$row['fname']." ".$row['sname'].", ";
              }
              echo "</br>Position 3: ";
              if ($row['position']==3){
              echo"".$row['fname']." ".$row['sname'].", ";
              }
              }
          mysqli_close($dbConnection);
          }
?>

唯一的问题是,那么它显然也会为每个用户回显"位置 2"和"位置 3"......关于如何拆分两个位置以使 while 循环在回声之后发生的任何建议?我也尝试像这样拆分while循环,但随后没有出现任何名称:

              $result = mysqli_query($ExampleDB,"SELECT * FROM members WHERE region=2 ORDER BY user DESC");
              echo "</br></br>Position 2: ";
              while($row2 = mysqli_fetch_array($result))
              {
                  if ($row2['position']==2){
                  echo"".$row2['fname']." ".$row2['sname']." ".$row2['user'].", ";
                  }
              }           
              echo "</br></br>Position 3: ";
              while($row3 = mysqli_fetch_array($result))
              {
                  if ($row3['position']==3){
                  echo"".$row['fname']." ".$row['sname'].", ";
                  }
              }

我也尝试将它们全部保留为$row,也没有产生任何名称。如何拆分 while 循环?或者有没有更好的方法来回显数组中位置 2,3 标头之后的特定名称?

$result = mysqli_query($ExampleDB,"SELECT * FROM members WHERE region=2 ORDER BY user DESC");
echo "</br></br>Position 2: ";
while($row2 = mysqli_fetch_array($result))
{
    if ($row2['position']==2)
    {
         echo"".$row2['fname']." ".$row2['sname']." ".$row2['user'].", ";
    }
}   
$result = mysqli_query($ExampleDB,"SELECT * FROM members WHERE region=2 ORDER BY user DESC");
echo "</br></br>Position 3: ";
while($row3 = mysqli_fetch_array($result))
{
     if ($row3['position']==3)
     {
        echo"".$row['fname']." ".$row['sname'].", ";
     }
}

如果您再次查询该语句,这实际上可以正常工作。在第一个 while 循环获取数组之后,数组到达数组的末尾。执行 fetch 数组不会返回任何内容。因此,您必须再次查询。

您可以在第一次输出标头后设置一个标志。这并不理想,但避免了重新设计您的方法:

$pos_two_header = true;
$pos_three_header = true;
while($row = mysqli_fetch_array($result))
    {
        if ($row['position']==2){
            if($pos_two_header) {
                echo "</br>Position 2: ";
                $pos_two_header = false;
             }
            echo"".$row['fname']." ".$row['sname'].", ";
        }
        if ($row['position']==3){
            if($pos_three_header) {
                echo "</br>Position 2: ";
                $pos_three_header = false;
             }
            echo"".$row['fname']." ".$row['sname'].", ";
        }
  }

根据 Jeroen 关于使用 data_seek 而不是第二次运行查询的评论,这将起作用,但并不像简单地寻求 0 索引那么容易。使用 PHP 5.4 处理此解决方案要容易得多,其中结果集作为可遍历返回。喜欢这个:

$result = $ExampleDB->query("SELECT * FROM members WHERE region=2 ORDER BY user DESC");
foreach($result as $row)
    {
        echo "</br>Position 2: ";
        if ($row['position']==2){
            echo"".$row['fname']." ".$row['sname'].", ";
        }
    }
$result->field_seek(0);
foreach($result as $row)
    {
        echo "</br>Position 3: ";
        if ($row['position']==3){
            echo"".$row['fname']." ".$row['sname'].", ";
        }
    }