我找到了一些连接到MySQL数据库的PHP代码,并为表public class QueueEmptyException extends QueueException{
public QueueEmptyException() {
super("Stack is empty");
}
}
的每一行获取列public void someMethodThrowingQueueExceptions() throws QueueException{
//some logic
//throw here either a full or empty exception
throw new QueueEmptyException();
}
。我很好奇为什么使用CityName
循环而不是Cities
或while()
。所以这里有关于for()
在循环数组时如何工作的问题:
首先,foreach
变量不是一个二维数组,它的行包含SQL查询中的城市列表,它的列包含查询每一行的列?
如果是这种情况,无法使用while()
或$row
来遍历for()
数组?
其次,foreach()
如何知道数组何时仅使用$row
的第一行中的while()
来结束循环?
第三,$row = $stmt->fetch_assoc()
如何在循环结束时不使用while()
移动到while()
数组的下一行?
最后但并非最不重要的是,$row
如何输出next()
数组的每一行的城市名称,而不指定要使用的数组的行,但仅指定列{{1} }}
感谢您的回答。
echo $row['CityName'];
答案 0 :(得分:3)
你可以遍历$ row,因为它是一个数组(一个简单的数组,而不是一个二维数组);但是你没有使用while
循环遍历一个名为$ row的数组,你正在迭代$stmt->fetch_assoc()
返回的结果集 - 这不是一个数组 - 并且分配返回的单个值从结果集中向该语句中的$row
行(请注意=
进行赋值)。
while
本身并没有神奇地移动任何指针;它是对$stmt->fetch_assoc()
的调用,它不仅返回单行结果,而且将结果集指针移动到下一个结果(并确定它何时到达结果集的末尾)
答案 1 :(得分:0)
while($this_is_true){
// do this
}
# if the condition is not true for this while stmt, it will not execute (not even once)
do{
// stuff here
} while($thisIsTrue);
# even if the condition isn't true, a do-while executes at least once (the first time)
关键是他们正在使用while(),因为它是一种懒惰的方式来说“只有在它是真的时才这样做”,所以他们不必在循环之前检查它是否为真。使用for循环,您需要知道循环的结果数。对于do,您需要在尝试使用结果(echo)之前知道结果。所以,你使用while()检查它是否有效,然后只用那段代码执行它。
就个人而言,我喜欢这样做......
if($query->num_rows > 0){
$query->bind_result($bindvar);
while($query->fetch()){
// do stuff
}
$query->close();
} else {
// no results found
}
答案 2 :(得分:0)
您可以使用foreach
代替while
。至少如果stmt
是mysqli_result
并且您的PHP版本不是非常过时(比5.4更新)。在这种情况下,你的循环将是:
foreach($stmt as $row)
{
echo $row['CityName'];
}
但这并不意味着$stmt
是一个2D数组。它是一个实现Traversable接口的对象。这意味着foreach循环将隐式调用所需的方法。