如下代码:
<?php
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
echo "Connection is successful!<br/>";
$sql = "SELECT * FROM users";
$users = $dbh->query($sql);
foreach ($users as $row) {
print $row["name"] . "-" . $row["sex"] ."<br/>";
}
foreach ($users as $row) {
print $row["name"] . "-" . $row["sex"] ."<br/>";
}
$dbh = null;
}
catch (PDOexception $e) {
echo "Error is: " . $e-> etmessage();
}
Connection is successful!
person A-male
person B-female
两次运行“ foreach”不是我的目的,我很好奇为什么两个“ foreach”语句仅输出一次结果?
以下是类似情况:
<?php
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
echo "Connection is successful!<br/>";
$sql = "SELECT * FROM users";
$users = $dbh->query($sql);
foreach ($users as $row) {
print $row["name"] . "-" . $row["sex"] ."<br/>";
}
echo "<br/>";
$result = $users->fetch(PDO::FETCH_ASSOC);
foreach($result as $key => $value) {
echo $key . "-" . $value . "<br/>";
}
$dbh = null;
}
catch (PDOexception $e) {
echo "Error is: " . $e-> etmessage();
}
输出:
Connection is successful!
person A-male
person B-female
SCREAM: Error suppression ignored for
Warning: Invalid argument supplied for foreach()
但是,当我从上述代码中删除第一个“ foreach”时,输出将变为正常:
<?php
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
echo "Connection is successful!<br/>";
$sql = "SELECT * FROM users";
$users = $dbh->query($sql);
echo "<br/>";
$result = $users->fetch(PDO::FETCH_ASSOC);
foreach($result as $key => $value) {
echo $key . "-" . $value . "<br/>";
}
$dbh = null;
}
catch (PDOexception $e) {
echo "Error is: " . $e-> etmessage();
}
输出:
Connection is successful!
user_id-0000000001
name-person A
sex-male
为什么会这样?
一个PDOStatement
(你有$users
)是向前光标。这意味着,一旦消耗(第一次foreach
迭代),就不会后退到结果集的开头。
您可以在之后关闭光标,foreach
然后再次执行该语句:
$users = $dbh->query($sql);
foreach ($users as $row) {
print $row["name"] . "-" . $row["sex"] ."<br/>";
}
$users->execute();
foreach ($users as $row) {
print $row["name"] . "-" . $row["sex"] ."<br/>";
}
或者您可以使用量身定制CachingIterator
的Fullcache进行缓存:
$users = $dbh->query($sql);
$usersCached = new CachedPDOStatement($users);
foreach ($usersCached as $row) {
print $row["name"] . "-" . $row["sex"] ."<br/>";
}
foreach ($usersCached as $row) {
print $row["name"] . "-" . $row["sex"] ."<br/>";
}
您会发现本CachedPDOStatement
课程的要点。缓存迭代器可能比将结果集存储到数组中更为理智,因为它仍提供PDOStatement
已包装对象的所有属性和方法。
问题内容: 有没有一种方法可以在Java 8中构建使用索引迭代的方法?理想情况下,我想要这样的东西: 我现在能做的最好的事情是: 问题答案: 由于您要遍历可索引的集合(列表等),因此我假设您可以仅遍历元素的索引: 生成的代码类似于使用经典i ++样式的for循环迭代列表,但具有更易于并行化的特性(当然,假设并发对params的只读访问是安全的)。
问题内容: 我有一个类似结构的数组,它公开了异步方法。异步方法调用返回数组结构,从而返回更多异步方法。我正在创建另一个JSON对象来存储从该结构获得的值,因此我需要注意跟踪回调中的引用。 我已经编写了一个蛮力解决方案,但是我想学习一个更惯用或干净的解决方案。 对于n级嵌套,该模式应该是可重复的。 我需要使用promise.all或一些类似的技术来确定何时解析封闭例程。 并非每个元素都必然涉及进行异
我有一个类似数组的结构,它公开异步方法。async方法调用返回数组结构,这些结构反过来公开更多的异步方法。我正在创建另一个JSON对象来存储从这个结构中获得的值,因此我需要小心跟踪回调中的引用。 我已经编写了一个暴力解决方案,但我想学习一个更惯用或干净的解决方案。 该模式应可重复n个嵌套级别 这是部分代码-
问题内容: 我有一个嵌套的数组,我想在其中显示结果的子集。例如,在下面的数组中,我想遍历嵌套array [1]中的所有值。 我试图使用foreach函数,但似乎无法正常工作。这是我的原始语法(尽管我意识到这是错误的)。 我试图避免对键是否与我要搜索的键相同的变量进行比较,即 有任何想法吗? 问题答案: 如果您知道嵌套数组中的级别数,则可以简单地执行嵌套循环。像这样: 如果您不知道数组的深度,则需要
产出: 请提供2个方法将产生不同输出的例子。
问题内容: 如果您有一个Array,并且想使用Java8 forEach()方法,那么哪种方法更好或更有效: 要么 差异是否显着,或者有更好的解决方案来解决? 问题答案: 都不行 如果您已经有一个数组, 我会用: 因为您将数组到流的转换留给了JDK-让它负责效率等。 但是,由于您没有数组,因此我将使用的varargs创建值的流: 这又让JDK负责有效地按需传输值。