【问题标题】:php while and for loops to fill array not workingphp while 和 for 循环填充数组不起作用
【发布时间】:2012-11-15 09:41:04
【问题描述】:

我有一个产品主控,其中有 2 个字段,一个用于主产品(字段名称为“Under”),第二个用于子产品(字段名称为“Prod_desc”) 我想要的是一个嵌套循环,我从事务表(ECR_CBDC)中捕获所有代码(字段名称是 Cylno)。

我有 2 个嵌套循环,第一个 while 循环用于 PRODUCT_MASTER,其中根据用户对主产品的选择选择子产品,第二个循环用于收集所有子产品的代码。

现在的问题是它只收集 1 个值,因为 FOR 循环会覆盖以前的值。是否有任何其他循环可以保存每个子产品的先前值。

$p=mysql_query("SELECT * FROM PRODMAST WHERE Under='$product'");
while ($p2=mysql_fetch_assoc($p))
{
    $prodesc=$p2['Prod_desc'];

    $dc=mysql_query("SELECT * FROM ECR_CBDC WHERE Prod_desc='$prodesc'  AND usr='$user'");
    $num_rows = mysql_num_rows($dc);
    $fill_from_array = array(); /* as "value"=>"option" */
    for($i = 1; $i <= $num_rows; $i++)
    {
        $row = mysql_fetch_assoc($dc);
        $fill_from_array[$row['Cylno']] = $row['Cylno'];
    }
}

【问题讨论】:

    标签: php mysql loops while-loop nested


    【解决方案1】:

    如果我理解您的要求 - $fill_from_array 只收集一行的值 - 我认为您需要在第一个循环之外定义 $fill_from_array,所以...

    $p=mysql_query("SELECT * FROM PRODMAST WHERE Under='$product'");
    $fill_from_array = array(); /* as "value"=>"option" */
    while ($p2=mysql_fetch_assoc($p))
    {
        $prodesc=$p2['Prod_desc'];
    
        $dc=mysql_query("SELECT * FROM ECR_CBDC WHERE Prod_desc='$prodesc'  AND usr='$user'");
        $num_rows = mysql_num_rows($dc);
        for($i = 1; $i <= $num_rows; $i++)
        {
            $row = mysql_fetch_assoc($dc);
            $fill_from_array[$row['Cylno']] = $row['Cylno'];
        }
    }
    

    这样就不会在每次 while() 循环循环时重写 $fill_from_array。是这个意思吗?

    【讨论】:

      【解决方案2】:

      不要在代码中模拟连接,而是使用JOIN 语法来减少循环和数据传输的数量:

      SELECT * FROM PRODMAST 
      INNER JOIN ECR_CBDC ON PRODMAST.Prod_desc=ECR_CBDC.Prod_desc AND usr='$user'
      WHERE Under='$product'
      

      【讨论】:

      • @user1387008 随着数据集的增长,这个解决方案将变得比两个循环快得多;只是要记住的事情。
      • @user1387008 由于您是 SO 新手……如果答案有用,您应该投票赞成(您现在有足够的代表)。
      猜你喜欢
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2020-03-30
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      相关资源
      最近更新 更多