在多维数组中添加或重写项


Add or override an item in a multidimensional array

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

我有这个:

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

如果我向具有相同idproduct的数组中插入一个乘积,我希望覆盖"amount",而不是向主数组添加一个新值。

我试过从$_SESSIONforeach循环,然后做array_search,但不知道这是否是最好的方法,唯一的方法。。。

提前谢谢。

如果您想快速访问商店阵列中已有的条目,并且不可能有两个条目具有相同的idproduct条目,则可以将产品id用作阵列中的键。然后使用array_key_exists检查条目是否已设置:

举个例子,假设您的产品id存储在$idProduct:中

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

如果使用通常构建的集合,则关联数组或对象的数组(DEMO):

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

你可以构建一个小功能,合并一个allready现有项目,或者在不存在的情况下添加它:

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

顺便说一下,这使用了php5.3匿名函数,所以请考虑这里的php版本。