2012-04-16 71 views
1

我的目标是将一组新产品记录追加到现有的关联数组中,但确保每个产品仅表示一次。我写了下面的函数。对于这样简单的事情来说,看起来太多的代码太多了。有我需要了解的PHP数组函数吗?添加到关联数组中 - 但没有重复项

function _append (&$already, $addition) { 
    while($result = mysql_fetch_array($addition)) { 
     $already_found = FALSE; 
     foreach ($already as $try) { 
      if ($try["products_id"] == $result["products_id"]) { 
       $already_found = TRUE; 
       break; 
      } 
     } 
     if (!$already_found) { $already[] = $result; } 
    } 
} 

回答

2

使用的产品ID为重点,像$already[$result['products_id']] = $result;,然后你可以使用array_key_exists轻松地检查产品ID对所有现有产品。 (或者,不要,无论哪种方式,每个ID只有一个产品;如果不检查,最新的复制将覆盖更早的复制。)

无论哪种方式,您都可以完全摆脱foreach

function _append(&$already, $addition) { 
    while ($result = mysql_fetch_array($addition)) { 
     if (!array_key_exists($result['products_id'], $already)) { 
      $already[$result['products_id']] = $result; 
     } 
    } 
} 

问题是,你的数组不再是数字索引。无论您向其添加项目,都可以使用它们的键(products_id的值)添加它们。但你可以像往常一样说foreach ($items as $item)

+0

我正在使用关联数组,因此$ item ['product_id']不是关键。我不知道如何应用您的答案。 – Smandoli 2012-04-16 01:29:08

+0

您正在为每个项目使用关联数组,但'$ already'显然是数字索引。据我了解,'products_id'字段*是关键;你的“重复”的整个定义是这两个匹配。如果你改变的东西,以便你使用该项目的products_id作为关键....呃。让我编辑。 – cHao 2012-04-16 01:33:22

+0

感谢您的编辑。我需要帮助。 :- – Smandoli 2012-04-16 01:42:18

1

如何将产品ID分配为$already中的数组密钥?

while($result = mysql_fetch_array($addition)) { 
    $already[$result['products_id']] = $result; 
} 

这当然会覆盖旧产品记录,但它应该优雅地避免重复!

+0

因此,将其更改为多维数组,对吗?我可以做到这一点,但我目前的解决方案确实有效,而关联数组非常方便。 – Smandoli 2012-04-16 01:35:04

+0

您所做的只是从PHP定义的键切换到您自己指定的键。 @cHao在上面很好地解释它。 – rjz 2012-04-16 01:42:51

+0

谢谢,我看到你的回答同意。不过,我确实需要额外的解释!而且我还需要该功能不会覆盖现有的记录。 – Smandoli 2012-04-16 01:44:11