【问题标题】:If true use foreach loop, else use while如果 true 使用 foreach 循环,否则使用 while
【发布时间】:2012-12-26 14:04:49
【问题描述】:

我正在尝试使用类似这样的方法将 MySQL while 循环链接到 foreach 循环中:

if($something == true){
  foreach($array as $arr){
} else {
  while($row = mysql_fetch_array($mysql_query)){
}
  // loop instructions
}

看起来很不对劲,我知道,但你知道我在做什么吗?如果$something 为真,我想从数组中获取数据,否则从数据库中获取数据

我有另一个解决方案的想法,它手动将数组与$mysql_query 的工作方式相匹配,这样我就可以将它们都与while 一起使用,就像这样:

if($something == true){
  $mysql_query = array("username" => "$_GET['username']", "password" => "$_GET['password']");
} else {
  $mysql_query = mysql_query("SELECT * FROM users WHERE usern......");
}

while($row = mysql_fetch_array($mysql_query)){
...

这是第二种方法,但它看起来也有问题,因为第一个数组是正常的,我想将该正常数组与 mysql_query 构建它的方式相匹配,以便它可以适应 while 循环

附言:我不想想重复编写循环指令,我希望它们都只使用我上面提到的一个

【问题讨论】:

  • if/else 替换为if(!$something) { $array = /* collect all results from MySQL */; }。之后,您将能够在这两种情况下使用foreach ($array as $arr) {。顺便说一句,停止使用mysql_ 函数并改用mysqli/PDO。
  • 看起来 $array 是一个多维数组。对吗,它是一个二维数组吗?结果集中是否有多行?
  • 我想将所有结果收集到一个数组中会增加 PHP 上的巨大过程,不过让我看看一种将它们收集到你的答案中的方法
  • 将所有结果收集到一个数组中对我来说似乎是个好主意。慎重使用 WHERE 和 GROUP 子句可以减小结果集的大小。
  • 欢迎来到 Stack Overflow! Please, don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?改为了解prepared statements,并使用PDOMySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial.

标签: php mysql database loops


【解决方案1】:

把你的处理放到一个函数中:

function process_data($data) {
    // do stuff
}


if($something){
    foreach($array as $arr){
        process_data($arr);
    }
} else {
    while($row = mysql_fetch_array($mysql_query)){
        process_data($row);
    }
}

【讨论】:

  • 在这两种情况下本质上都在处理数组时,甚至没有理由调用该函数两次。这可以正常工作,但不是最简洁的解决方案。
  • @Dutchie432 是的,这就是我要说的,我正在尝试找到最简单且代码更少的解决方案,而无需重复单个变量。虽然没有那么糟糕
  • 这是最灵活的。考虑一个返回一百万条记录的查询。你不会想要将它们全部分配到一个数组中——这是一个非常昂贵的操作——只是为了让你的代码看起来更整洁。你迭代尽可能多的记录,然后你打破。将 while 保留在那里可以让您选择添加条件中断。
  • 不太确定我是否能看到使用函数的任何优势。事实仍然是,如果 $something 不真实,编程将获取完全相同数量的行并以完全相同的方式处理它们。
  • 如果我错了,请纠正我,但您似乎做了几个假设。 1. 您假设 $array 和 mysql_fetch_array() 将包含/返回相似数量的记录。 2. 你假设 mysql_fetch_array() 返回一个微不足道的记录数。 3. process_data() 是一个微不足道的、不可重用的逻辑,它可以愉快地位于一个 foreach 块中。我宁愿不做任何这些假设。
【解决方案2】:

这里的其他答案很好,但您最好确保$array 是一个有效的数组,而不管something...怎么样

if (!something){
    $array = array();
    while($row=mysql_fetch_array($mysql_query)) {$array[] = $row;}
}

foreach($array as $arr){
   // do work
}

【讨论】:

  • 如果我错了,请纠正我。mysql_fetch_array 只抓取一行数据对吗?那里大约有 32,000 个,这就是为什么我说将它们全部收集到一个数组中然后使用另一个循环做另一项大工作将是一个巨大的过程
  • 我正在更新您评论的内容。很好的收获。
  • 这应该可以完成您想要的,而无需重复。
  • 注意php.net/manual/en/function.mysql-fetch-array.php 这个函数的默认标志是MYSQL_BOTH。作者可能想要 $row 变量中的重复数据,但我猜这不会有任何附加值。
  • 每次调用mysql_fetch_array() 都会返回一条记录。同样,您不想将 32K 记录粘贴到数组中。
【解决方案3】:

如果您稍微扩大一下您所解释的范围,您可能会得到更好的答案。如果不知道事物是什么、数据是什么,再加上最终目标,那么很难判断您应该使用哪种结构。

在我看来,如果循环内的代码相同,则只需使用函数即可实现此目的。像这样:

if($something == true)
{
    foreach($array as $arr)
    {
        doWork($arr);
    }
}
else
{
     while($row = mysql_fetch_array($mysql_query))
     {
         doWork($row);
     }
}

function doWork($arr)
{
 //...
}

【讨论】:

    【解决方案4】:

    您不能在这样的循环内嵌套循环指令。您需要在 IF 语句中完全有两个单独的循环。

    if($something == true){
      foreach($array as $arr){
         // do work
      }
    } else {
      while($row = mysql_fetch_array($mysql_query)){
        // do work
      }
    }
    

    【讨论】:

    • 然后,将你的工作放入一个函数中,并在循环中调用该函数。
    • 这么复杂,我提到的第二种解决方案不能完成吗? mysql_query 如何将其结果构建到数组中?
    • 编程可能很复杂。这就是我们得到大笔报酬的原因:-)
    • @user - 就编程而言,这并不是那么复杂。事实上相当标准的做法。
    • 这个概念很简单,解决方案过于复杂。
    【解决方案5】:

    也许你可以从这个角度来看。请注意,此代码使用 mysql_fetch_assoc() 而不是 mysql_fetch_array()。尝试这两个函数并使用 var_dump() 查看结果行。您将看到 mysql_fetch_array() 的数据量是原来的两倍。您可能想要,但可能不会。

    if ($something !== true)
    {
        $array = array();
        while($row = mysql_fetch_assoc($mysql_query_result_resource))
        {
            $array[] = $row;
        }
    }
    foreach($array as $arr)
    {
        /* PROCESS */
    }
    

    【讨论】:

    • 我同意其他表明 MySQL 结束的帖子。今天不应该编写依赖于已弃用功能的新代码。
    • 这对 PHP 来说是一个相当大的过程,对吧?将大约 32k 的结果收集到一个数组中,然后再做一个非常大的工作,会有多严重的伤害?
    • 因此,如果您的查询返回大量记录,那么当您甚至可能不需要全部记录时,您会将它们全部存储在内存中?
    • 在给出的示例中,查询似乎与 HTTP 请求 $_GET 中的值匹配,当它说 SELECT * FROM users WHERE usern..... 不知道 ... 包含什么时,我不能真正建议您如何优化查询,但如果您期望结果集中有 32,000 行,您可能需要重新考虑 SELECT * ,而只选择您必须拥有的列。考虑使用 WHERE 和 GROUP 以及 ORDER 和 LIMIT 子句。
    • @paulgrav:如果您不知道如何获取所需的行,我认为您只会从结果集中返回 32,000 行。我想不出网页中的 32,000 行有多大用处 ;-)
    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2014-12-05
    • 2013-06-27
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多