数组和每个循环问题

时间:2013-04-16 21:14:27

标签: php

代码如下,如果我在数组中运行一个值,结果是正确的,如果我运行多个值,结果是价格是不正确的,就像它已经弄乱了某些值?帮助赞赏


    $dido=array('42204131','22204131'); 
    foreach($dido as $did):

    $query = "select * from dispatch,link where lid=dlid and did=$did";
    $result = mysql_query($query) or die(mysql_error());
    while($row = mysql_fetch_array($result)){

    $vanc1=$row['vanc1'];
    $vanc2=$row['vanc2'];
    $vanc3=$row['vanc3'];
    $vanc4=$row['vanc4'];
    $vanc5=$row['vanc5'];

    $anc1=$row['anc1'];
    $anc2=$row['anc2'];
    $anc3=$row['anc3'];
    $anc4=$row['anc4'];
    $anc5=$row['anc5'];

    // price anc1
    $querypanc1 = "select pprice from products where pid=$anc1";
    $resultpanc1 = mysql_query($querypanc1);
    while($row = mysql_fetch_array($resultpanc1))
    {
        $priceanc1=$row[pprice];
        $tpriceanc1=$vanc1*$priceanc1;

    }
    // price anc2
    $querypanc2 = "select pprice from products where pid=$anc2";
    $resultpanc2 = mysql_query($querypanc2);
    while($row = mysql_fetch_array($resultpanc2))
    {
        $priceanc2=$row[pprice];
        $tpriceanc2=$vanc2*$priceanc2;

    }
    // price anc3
    $querypanc3 = "select pprice from products where pid=$anc3";
    $resultpanc3 = mysql_query($querypanc3);
    while($row = mysql_fetch_array($resultpanc3))
    {
        $priceanc3=$row[pprice];
        $tpriceanc3=$vanc3*$priceanc3;

    }
    // price anc4
    $querypanc4 = "select pprice from products where pid=$anc4";
    $resultpanc4 = mysql_query($querypanc4);
    while($row = mysql_fetch_array($resultpanc4))
    {
        $priceanc4=$row[pprice];
        $tpriceanc4=$vanc4*$priceanc4;

    }
    // price anc5
    $querypanc5 = "select pprice from products where pid=$anc5";
    $resultpanc5 = mysql_query($querypanc5);
    while($row = mysql_fetch_array($resultpanc5))
    {
        $priceanc5=$row[pprice];
        $tpriceanc5=$vanc5*$priceanc5;

    }


    $gtprice=$tpriceanc1+$tpriceanc2+$tpriceanc3+$tpriceanc4+$tpriceanc5;

        $qrygt="UPDATE dispatch SET gtprice=$gtprice WHERE did=$did";
        $resultgt=@mysql_query($qrygt);

        }
        endforeach; 

2 个答案:

答案 0 :(得分:1)

您的第一个也是最大的问题是您的代码的复制面食性质。让我们试着打破你正在做的事情:

  • 设置ID列表
  • 对这些ID运行查询
  • 将结果放入数组
  • 对每个结果运行单独的查询

你也在使用一些非常笨拙的语法。 (即foreach($foo as $bar):)。

将这些事情分解为方法。什么是方法?它需要输入并将其转换为输出。

//returns an array of price information
public function getPrices($idArray) { //note the good method and parameter names!
  //do stuff
}

既然我们知道自己在做什么,我们就可以开始填写实施细节了:

public function getPrices($idArray) {
  foreach($idArray as $id) {
    //somehow get the gross-scale information
    //then put it in a data object
    //then call a function to get specific information
  }
}

该子方法应该做什么?让我们看看你当前的代码片段:

 // price anc1
 $querypanc1 = "select pprice from products where pid=$anc1";//sets up sql query
 $resultpanc1 = mysql_query($querypanc1);                    //runs the query
 while($row = mysql_fetch_array($resultpanc1)) {             //for each result
   $priceanc1=$row[pprice];                                  //gets the price
   $tpriceanc1=$vanc1*$priceanc1;                            //calculates some other price
 }

最后两行确实暗示了一个对象,但也许这对你来说太重了。前两行是锅炉板,你无休止地重复。让我们写一个函数!

public function getPrices($name, $pid, $multiplier) {
  $sqlQuery = "SELECT pprice FROM products WHERE pid=$pid";
  $result = mysql_query($sqlQuery);
  $prices = array();
  while ($row = mysql_fetch_array($result) {
    $key = "price".$name;//$key will be something like 'priceanc1'
    $prices[$key] = $row[pprice];
    $tkey = "tprice".$name;
    $prices[$tkey] = $prices[$key] * $multiplier;
  }
}

现在,这个函数有点不干净,因为它试图一次做两件事(查询数据库,然后将数据按摩成一个可用的数组),但我希望它类似于你正在做的事情。写完这个函数后,我们可以回到我们的高级函数调用它:

public function getPrices($idArray) {
  foreach($idArray as $id) {
    $sqlQuery = "SELECT * from dispatch, link WHERE lid=dlid and did=$id";
    $prices = array();
    while ($row = mysql_fetch_array($result) {
      for ($idx = 1; $idx <= 5; $idx++) {
        $name = "anc".$idx;
        $pid = $row[$name];
        $multiplier = $row["vanc".$idx];
        $priceArray = getPrices($name, $pid, $multiplier);
        $prices = array_merge($prices, $priceArray);
      }
    }
  }

  //put a var_dump here to check to see if you're getting good results!

  return $prices;//Should be the aggregated prices you've gotten from the db
}

现在,这就是您尝试做的事情,但我承认我不了解您的数据库是如何设置的,或者您的变量实际意味着什么。按下!我们还注意到,不必要的数据按摩就会消失。

您可以这样称呼:

$ids = array();
$ids[] = 42204131;
$ids[] = 22204131;
$prices = getPrices($ids);
var_dump($prices);//shows the result of your work

现在你有了价格,你可以将它们传递给另一个函数来运行更新:

updatePrices($prices);

我会让你自己写那部分。但要记住;打破你正在做的事情,并通过相同的功能处理重复的元素。这里要学到的真正教训是编程实际上是在沟通:你的代码没有任何通信,因为有太多重复的噪音。使用好的变量名称。通过单个任务加强您正在进行的功能。这样,任何阅读你的代码的人(包括你!)都会知道你要做什么以及你哪里出错了。

答案 1 :(得分:1)

1)我可以在您的代码中发现的唯一可能问题是,当您的某些select pprice from products where pid ...查询未返回任何数据时,您保留前一次迭代的$tpriceancX值。

2)另外(超出主题)你可以用for循环替换5块重复的代码。

$gtprice = 0;
for ($i = 1; $i <= 5; $i++)
{
    $querypanc = "select pprice from products where pid=".$row["anc$i"];
    $resultpanc = mysql_query($querypanc);
    while($pancrow = mysql_fetch_array($resultpanc))
    {
        $priceanc=$pancrow[pprice];
        $tpriceanc=$row["vanc$i"]*$priceanc;
        $gtprice += $tpriceanc;
    }
}