带有数组更新的PHP嵌套数组循环


PHP nested array loops with array update

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

我有两个从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"。

任何想法都将不胜感激。

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

首先:

去掉那些递增循环。在PHP中,我们通常使用foreach进行迭代,它可读性更强:

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;
    }
  }
}

在您的示例中,两个表中的产品ID都是ProdID;您正在检查2个未定义/无效的数组元素(它们将相等)。

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

数组示例的语法错误:

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

这意味着包含任意内容的数组将被包含到另一个数组中。

请参见此示例:http://codepad.org/OMbnEEjA然后你就会看到区别。

几个问题:

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

    If ($catalog[$x]['ProductID'] == $cart[$y]['ProductID'] )
    

将其更改为:

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

    $cart[$x]['InBasket'] = 1;
    

    但是你在问题中说你想更新目录,所以应该是:

    $catalog[$x]['InBasket'] = 1;
    

你应该使用@jicd建议的方法进行循环,这会容易得多。

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