PHP嵌套数组循环与数组更新

时间:2012-07-31 13:01:10

标签: php

我来自VB;访问;最近向WAMP引入了SQL Server背景。我有一个问题,我现在几个星期都无法解决,我想我已经访问过网络上的每个论坛(包括这里)都没有成功。

我有两个从MySQL记录集中填充的数组,一个用于站点Cart,另一个用于站点部门(目录),请参阅下面填充数组的手动解释。

$catalog[] = array( 
  array('ProdID'=>2,'Name'=>'Alpha','DepID' =>2,'InBasket'=>'0'),       
  array('ProdID'=>6,'Name'=>'Alpha','DepID' =>2,'InBasket'=>'0'),
  array('ProdID'=>7,'Name'=>'Alpha','DepID' =>2,'InBasket'=>'0'),
  array('ProdID'=>8,'Name'=>'Alpha','DepID' =>2,'InBasket'=>'0'),
  array('ProdID'=>9,'Name'=>'Alpha','DepID' =>2,'InBasket'=>'0'),
);


$cart[] = array(
  array('Name'=>'Alpha2','Loc'=>'e_vol1','BasketID'=>'81','ProdID'=>'2','Quant'=>'1'),
  array('Name'=>'Beta4','Loc'=>'e_vol2','BasketID'=>'81','ProdID'=>'4','Quant'=>'1'),
  array('Name'=>'Alpha8','Loc'=>'e_vol3','BasketID'=>'81','ProdID'=>'8','Quant'=>'1'),
  array('Name'=>'Gamma21','Loc'=>'e_vol4','BasketID'=>'81','ProdID'=>'21','Quant'=>'1'),
);

我需要做的是每次选择新目录时循环遍历目录数组,将购物车中每行的ProdID与目录中每行的ProdID进行比较,当找到匹配时我想将该行的目录“InBasket”值仅更新为“1”,表示该项目已经在客户购物车中,然后我可以在屏幕上显示(客户只能购买任何一种商品)。

有五个不同的部门(目录),其中包含最多10个产品,购物车将包含四个项目(如果我很幸运)

我尝试了一些循环,但它们似乎不起作用。

for ($x = 0; $x < count($catalog); $x++)
{
  for ($y = 0; $y < count($cart); $y++)
  {
    If ($catalog[$x]['ProductID'] == $cart[$y]['ProductID'] )
    {
      $cart[$x]['InBasket'] = 1;
    }
  }
}

我认为我的数组是正确的,但是,无论如何,循环似乎都会更新'InBasket'。

任何想法都会受到赞赏。

4 个答案:

答案 0 :(得分:4)

您的$cart有一个名为ProdID的数组键,但您正在尝试使用不存在的ProductID。然后,您正在尝试更新InBasket子阵列的$cart键,实际上,它是$catalog数组的成员。

第一件事是第一件事:

摆脱那些增量循环。在PHP中,我们通常使用foreach for iteration,它更具可读性:

foreach ($catalog as &$catalog_item) {
  foreach($cart as $cart_item) {
    if ($catalog_item['ProductID'] == $cart_item['ProdID']) {
       // The InBasket key is part of the catalog, not the cart!
       $catalog_item['InBasket'] = 1;
    }
  }
}

答案 1 :(得分:2)

在您的示例中,两个表中的产品ID均为ProdID;你正在检查2个undefined / void数组元素(它们是相同的)。

if ($catalog[$x]['ProdID'] == $cart[$y]['ProdID'] )

答案 2 :(得分:0)

数组示例的语法错误:

$catalog[] = array('whatever');

这意味着该数组将包含在另一个数组中。

请参阅此示例:http://codepad.org/OMbnEEjA 然后你会看到差异。

答案 3 :(得分:0)

几个问题:

  1. 您使用了错误的密钥名称:

    If ($catalog[$x]['ProductID'] == $cart[$y]['ProductID'] )
    
  2. 将其更改为:

        If ($catalog[$x]['ProdID'] == $cart[$y]['ProdID'] )
    
      在你正在做的第二个循环中
    1. $cart[$x]['InBasket'] = 1;
      

      但您在问题中表示要更新目录,因此它应该是:

      $catalog[$x]['InBasket'] = 1;
      
    2. 您应该使用@jicd建议的方法进行循环,这样更容易。

      查看here了解有关如何使用foreach的更多信息。