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

问题描述 投票:0回答:3

我有点进退两难,在 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 />';
}
  • 我的问题是有什么真正的区别吗?
  • 什么时候使用其中一种更好,或者两者都使用可以?
  • 这两者中的任何一个会给您带来更大的灵活性吗?
php while-loop foreach mysqli result-object
3个回答
4
投票

在这种情况下它们是完全等价的。

mysqli_result
实现了
Traversable
接口(如此处所述: http://www.php.net/mysqli_result ),因此也可以使用
foreach
循环进行迭代。

我认为,在内部,在

foreach
对象上调用
mysqli_result
也会执行对
mysqli_fetch_assoc
的调用。

我认为使用第一种方法或第二种方法没有什么区别;然而,第一个看起来更漂亮,对我来说“更多 PHP5”!
说到灵活性,第一个当然也更灵活,因为您可以将该代码与任何实现

Traversable
的对象一起使用,而不仅仅是
mysqli_result


-1
投票

对于从数据库获取结果,我确实更喜欢 while 方法,因为如果获取返回 false,则其主体不会执行,而 foreach 主体将失败,您需要检查 false,因为访问false 的按键会崩溃。

来自:https://www.php.net/manual/en/mysqli-result.fetch-assoc.php

返回表示所获取行的关联数组,其中数组中的每个键表示结果集的某一列的名称,如果结果集中没有更多行,则返回 null,如果失败则返回 false。

$fetch = false;

foreach($fetch as $row) {
    echo $row['title'];
}

警告:foreach() 参数必须是 array|object 类型,在第 5 行 /in/8gGsR 中给出 false

否则需要一段时间

$fetch = false; while($row = $fetch) { echo $row['title']; }
我们想要的什么都没有发生,因为条件是 

false。如果没有更多结果,则返回 null,这也会导致条件为 false

这也适用于所有 PDO 获取方法。


-2
投票
我发现了这个:

for 与 foreach 与 while 在 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 />"; } } }

我想这取决于您需要什么值、您需要多少控制以及您需要它的位置。

© www.soinside.com 2019 - 2024. All rights reserved.