我想知道如何从多维数组中找到数组键。
我有这个:
$_SESSION['shop'] = array();
//Now I insert some values
$_SESSION['shop'][] = array("idproduct", "amount");
如果我向具有相同idproduct的数组中插入一个乘积,我希望覆盖"amount",而不是向主数组添加一个新值。
我试过从$_SESSION
用foreach
循环,然后做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版本。