添加或覆盖多维数组中的项

时间:2014-04-16 07:23:42

标签: php arrays search multidimensional-array

我想知道如何从多维数组中找到数组键。

我有这个:

$_SESSION['shop'] = array();
//Now I insert some values
$_SESSION['shop'][] = array("idproduct", "amount");

我想,如果我将产品插入具有相同idproduct的数组,则覆盖" amount",而不是向主数组添加新值。

我尝试使用foreach中的$_SESSION进行循环并执行array_search,但不知道这是否是最佳方式,唯一一个...

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果您想快速访问商店阵列中现有的条目,并且不应该有两个具有相同idproduct条目的条目,您可以只使用产品ID作为密钥你的阵列。然后使用array_key_exists检查条目是否已设置:

给出示例,假设您在$idProduct中存储了产品ID:

if(array_key_exists($idProduct,$_SESSION['shop'])) {
  $_SESSION['shop'][$idProduct][amount]++;
}
else {
  $_SESSION['shop'][$idProduct] = array("idproduct" => $idProduct, "amount" => 0);
}

答案 1 :(得分:1)

如果你使用它们通常是如何构建的集合,那么一组关联数组或对象(DEMO):

$products = array(
    array('idproduct' => 1, 'amount' => 5),
    array('idproduct' => 2, 'amount' => 10),
    array('idproduct' => 3, 'amount' => 11),
    array('idproduct' => 4, 'amount' => 5)
);

你可以构建一个小函数,它合并一个已经存在的项目,或者如果不存在则添加它:

function addOrOverride(&$arr, $newItem) {
    $filtered = array_filter($arr, function($item) use($newItem) {
        return $item['idproduct'] == $newItem['idproduct'];
    });

    if(count($filtered) > 0) {
        $key = key($filtered);
        $arr[$key] = array_merge($arr[$key], $newItem);
    } else {
        $arr[] = $newItem;
    }
}

并使用您的新数据或现有数据调用它:

addOrOverride($products, array('idproduct' => 4, 'amount' => 6));

您的$products数组如下所示:

array(4) {
  [0]=> array(2) {["idproduct"]=> int(1) ["amount"]=> int(5)}
  [1]=> array(2) {["idproduct"]=> int(2) ["amount"]=> int(10)}
  [2]=> array(2) {["idproduct"]=> int(3) ["amount"]=> int(11)}
  [3]=> array(2) {["idproduct"]=> int(4) ["amount"]=> int(6)}
}

这顺便使用了一个php 5.3匿名函数,所以请考虑这里的php版本。