【问题标题】:Restarting a While Loop重新启动 While 循环
【发布时间】:2026-02-09 06:50:02
【问题描述】:

是否可以重新启动 while 循环?我目前在 foreach 循环中存在一个 while 循环,我需要 while 语句每次都从头开始。

$sql = mysqli_query($link, "SELECT * FROM products");
$products = array('Milk', 'Cheese', 'Eggs');
$i = 0;
$total = count($products); //This is in case I change the product list.

if($sql)
{
    foreach($products as $v)
    {
        while($r = mysqli_fetch_assoc($sql))
        {
            if($r['Name'] == $v)
            {
                echo $r['Name'] . " - £" . $r['Price'];
                break;
            }
        }
    }
}

当代码运行并生成MilkEggs 但在数据库中Cheese 出现在Eggs 之前,我的问题出现了,因此它似乎永远不会被找到。如何重新启动 while 循环以强制代码从 sql 查询开始检查每个值?

已解决:使用散列来查询而不是循环 sql。

【问题讨论】:

  • 为什么要重新启动while循环,首先将所有数据提取到一个数组中并像正常的内部循环一样进行
  • @MansoorkhanCherupuzha 我从未将数据提取到数组中?我假设运行一个 while 循环,然后在里面运行一个 foreach($row) 这就是你的意思?

标签: php mysql foreach while-loop


【解决方案1】:

我认为最好的办法是将查询结果存储在哈希中以进行 O(1) 查找,而不是一遍又一遍地从 sql 中读取。

$sql = mysqli_query($link, "SELECT * FROM products");
$sql_products = array();
$products = array('Milk', 'Cheese', 'Eggs');
$i = 0;
$total = count($products); //This is in case I change the product list.

if($sql)
{
    while($r = mysqli_fetch_assoc($sql))
    {
        $sql_products[$r['Name']] = $r;
    }
    foreach($products as $v)
    {
        if(array_key_exists($v,$sql_products))
        {
            echo $v . " - £" . $sql_products[$v]['Price'];
        }
    }
}

【讨论】:

  • 我认为这与@MansoorkhanCherupuzha 所说的有些相似?似乎将它存储在一个数组中?
  • 是的,类似。但是使用散列而不是数组,因此查找要快得多。
  • @MikeShaw,是的,这就是我的意思
  • 太棒了,很有魅力,非常感谢你们! php.net 上是否有页面或任何可以链接到我的页面,以便我了解有关哈希的更多信息?