【问题标题】:How does looping though a PHP array using While() work?使用 While() 循环遍历 PHP 数组是如何工作的?
【发布时间】:2018-09-18 05:01:03
【问题描述】:

我找到了一些连接到 MySQL 数据库的 PHP 代码,并为表 Cities 的每一行获取列 CityName。我很好奇为什么使用while() 循环而不是for()foreach。所以这是我关于 while() 在循环数组的情况下如何工作的问题:

  • 首先,$row 变量是不是一个二维数组,它的行包含 SQL 查询中的城市列表,它的列包含查询每一行的列?

  • 如果是这种情况,不能使用for()foreach() 循环遍历$row 数组吗?

  • 第二,while()如何知道数组何时结束,只在while()的第一行使用$row = $stmt->fetch_assoc()来结束循环?

  • 三、while()如何在循环结束不使用next()的情况下移动到$row数组的下一行?

  • 最后但并非最不重要的一点是,echo $row['CityName']; 如何在不指定要使用的数组行但仅是列CityName 的情况下输出$row 数组的每一行的城市名称?

感谢您的任何回答。

$query="SELECT CityName FROM Cities";

if($stmt = $connection->query("$query"))
{

  while ($row = $stmt->fetch_assoc()) 
  {   
    echo $row['CityName'];
  }

}
else
{
  echo $connection->error;
}

【问题讨论】:

  • 一个......................一次问题。您发布的内容过于宽泛。
  • $row 是一维数组 = 1 行。
  • while ($row = $stmt->fetch_assoc()) 是等式。的:while (true) { $row = $stmt->fetch_assoc(); if (!$row) 中断; ...
  • 1) 没有。 1.b)它可以,但不适用于这里。 2)当fetch_assoc() 返回NULL(意味着没有更多的结果要获取)时,它被强制转换为false,这使得循环结束。 3) 这就是 loops 在其块的末尾所做的 - 他们 loop 返回。 4) $row 只是结果的 one 行...我建议你去学习一些有关计算机程序如何工作的基础知识。
  • 注意:试着改掉在一次性变量中声明 SQL 语句的习惯,这些变量只使用一次。在将查询直接提供给函数的情况下,跟踪代码要容易得多,并且不再有可能搞砸并发送$sql3,而不是视觉上相似的$sql8。还要避免像 "$x" 这样的反模式,其中 $x 单独是等效的。

标签: php mysql arrays mysqli


【解决方案1】:

您可以使用foreach 代替while。至少如果 stmtmysqli_result 并且您的 PHP 版本不是非常过时(比 5.4 更新)。在这种情况下,您的循环将是:

foreach($stmt as $row) 
{   
  echo $row['CityName'];
}

但是这并不意味着$stmt 是一个二维数组。它是一个实现 Traversable 接口的对象。这意味着 foreach 循环将隐式调用所需的方法。

【讨论】:

    【解决方案2】:
    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 循环,您需要知道循环的结果数。做一件事,在尝试使用结果(回显)之前,您需要知道有结果。因此,您使用 while() 来检查它是否有效,然后只用那段代码执行它。

    就个人而言,我喜欢做...

    if($query->num_rows > 0){
     $query->bind_result($bindvar);
     while($query->fetch()){
      // do stuff
     }
     $query->close();
    } else {
     // no results found 
    }
    

    【讨论】:

      【解决方案3】:

      你可以循环遍历$row,因为它是一个数组(一个简单的数组,不是二维数组);但是您没有使用while 遍历名为$row 的数组,而是遍历$stmt->fetch_assoc() 返回的结果集(这不是数组)并将单个返回行的值分配给@987654323 @ 在该语句中(注意 = 用于赋值)从结果集中。

      while 本身不会神奇地移动任何指针;这是对$stmt->fetch_assoc() 的调用,它不仅返回单行结果,而且将结果集指针移动到下一个结果(并确定它何时到达结果集的末尾)

      【讨论】:

      • 非常感谢,您帮助我了解了发生了什么。
      猜你喜欢
      • 2011-10-30
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 2013-11-23
      • 2013-03-14
      • 2011-08-23
      • 2011-05-23
      • 2012-11-14
      相关资源
      最近更新 更多