使用foreach循环迭代结果集对象与在while循环中调用mysqli_fetch_assoc()方法有什么区别?

18
我有一个小困扰,在PHP中,无论是foreach循环还是while循环,在这种情况下似乎都能做到同样的事情。
foreach ($execute->result as $item) {
    echo $item['user_pass'] . '<br />';
}

while ($row = mysqli_fetch_assoc($execute->result)) {
    echo $row['user_pass'] . '<br />';
}

我的问题是有没有真正的区别? 什么时候使用其中一个会更好,还是两者都可以使用? 这两者中的任何一个能给你更大的灵活性吗?

不确定,我总是使用 while 循环来进行数据库查询。 - boomoto
1
我不认为这个问题是重复发布的那个问题,虽然它们很相似。 - ItalyPaleAle
@Qualcuno 确实。我会找到实际的帖子。最好点上“i”,划掉“T” ;) 编辑: 这里有一个 https://dev59.com/aHE85IYBdhLWcg3w1HKF ,这个更适合作为重复内容。 - Funk Forty Niner
1
哇,伙计们,我的问题是在给定情况下这些循环的行为...情况是关键词,我的问题可能与其他人类似,但有其独特之处。但是感谢大家尝试回答我的问题 :) - Tomazi
@Tomazi 这就是为什么我重新打开了这个问题。我希望答案/评论对您有所帮助。 - Funk Forty Niner
显示剩余9条评论
3个回答

5
在这种情况下,它们完全等效。 mysqli_result 实现了 Traversable 接口(文档在此处:http://www.php.net/mysqli_result),因此它也可以使用 foreach 循环进行迭代。
我想,内部调用 mysqli_result 对象的 foreach 也会执行对 mysqli_fetch_assoc 的调用。
我认为使用第一种方法或第二种方法都没有任何区别;然而,对于我来说,第一个看起来更漂亮,更像是“PHP5”!
谈到灵活性,第一个显然更加灵活,因为你可以将该代码与实现了 Traversable 接口的任何对象一起使用,而不仅仅是 mysqli_result

从哲学上讲,遍历列表元素似乎更加清晰,然后测试我们是否到达列表的末尾并遍历下一个元素,所以我同意。 - erik258

0

通过foreach迭代查询结果集对象:

  1. 更简洁的语法。
  2. 无需编写/调用迭代的"_fetch"方法。
  3. 可以在签名中使用"数组解构语法"来缩小行数据的范围或以其他方式操作值的赋值。
    foreach ($result as ['fav_column' => $fav]) { echo "$fav\n"; }
  4. 只能使用关联键的数组语法访问行数据。
    不过,在循环体中将行数组转换为行对象是微不足道的。
    而且可以提议从0开始递增的数字列别名,然后可以将数组视为"索引" ...嗯。
    SELECT col_name AS '0', another_col AS '1' ...
  5. 如果在迭代过程中使用行"计数"变量有优势,声明$i(或其他名称)作为保存第一级键的变量将方便地执行递增操作。
    foreach ($result as $i => $row) { ... }
通过while循环迭代查询结果集对象:
  1. 更不简洁的语法。

  2. 更多功能强大的工具来指定键/数据类型(索引、关联或两者兼备),以及根据获取方法模式(有很多)来确定有效载荷。
    while ($row = $result->fetch_row()) { ... } // 索引行数据
    while ($row = $result->fetch_array()) { ... } // 索引和关联数据
    while ($obj = $result->fetch_object()) { ... } // 行作为对象

  3. 如果需要额外的循环中断条件,可以将其清晰地嵌入到while()条件中。
    while ($someFlag === true && $row = mysqli_fetch_assoc($result)) { ... }

  4. 如果需要行计数变量,则必须通过其他过程手动声明和递增。
    $i = 0; while ($row = mysqli_fetch_assoc($result)) { ... ++$i; }


最后,我的建议是使用foreach(),除非你有充分的理由使用while()_fetch()调用。

主题注释:来源

8.0.0 mysqli_result 现在实现了 IteratorAggregate。
之前是实现了 Traversable。


-2
我看到了这个:

for vs foreach vs while which is faster for iterating through arrays in php

答案说速度上的差异非常微小,无论你使用哪种方式都几乎没有影响。
我喜欢使用foreach循环来遍历返回的信息,因为我可以访问键和值,这在需要时非常方便。
$returned = array(array("userName" => "Tim"),array("userName" => "Bob"), array("userName" => "Guy"));

foreach($returned as $L1)
{
  foreach($L1 as $L2 => $val)
  {
      if($L2 === "userName")
      {

         echo 'Hello: ' . $val . "<br />";

      }

  }

}

我猜这取决于你需要什么值,需要多少控制以及你需要在哪里使用。


1
这与 whileeach 有何不同? - Royal Bg
我只是在陈述我喜欢使用的东西,并提供另一篇帖子关于速度的建议。不要担心,哈哈。 - user2296112
起初我认为这个链接很有用,但时间结果可能不适用于这种情况:$result不是一个数组,而是一个理解mysqli_fetch_assoc()的对象。时间可能主要由每次迭代的fetch_assoc支配,而不是任何循环开销。 - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接