我有我的学校项目的代码,并认为代码完成了我想要它做的工作,我仍然继续得到关于$ _SESSION []的错误使用{{1}时不是数组参数}和array_replace()
函数:
会话已在标题上启动:
array_merge()
用于将 // Start Session
session_start();
初始化为数组:
$_SESSION['cart']
从下拉菜单添加产品: - (只是为了查看会话的分配方式:)
// Parent array of all items, initialized if not already...
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = array();
}
接下来是问题出现的地方,当他们尝试更新产品时:
if (isset($_POST['new_item'])) { // If user submitted a product
$name = $_POST['products']; // product value is set to $name
// Validate adding products:
if ($name == 'Select a product') { // Check if default - No product selected
$order_error = '<div class="center"><label class="error">Please select a product</label></div>';
} elseif (in_array_find($name, $_SESSION['cart']) == true) { // Check if product is already in cart:
$order_error = '<div class="center"><label class="error">This item has already been added!</label></div>';
} else {
// Put values into session:
// Default quantity = 1:
$_SESSION['cart'][$name] = array('quantity' => 1);
}
}
请注意,// for updating product quantity:
if(isset($_POST['update'])) {
// identify which product to update:
$to_update = $_POST['hidden'];
// check if product array exist:
if (in_array_find($to_update, $_SESSION['cart'])) {
// Replace/Update the values:
// ['cart'] is the session name
// ['$to_update'] is the name of the product
// [0] represesents quantity
$base = $_SESSION['cart'][$to_update]['quantity'] ;
$replacement = $_SESSION['cart'][$to_update] = array('quantity' => $_POST['option']);
array_replace($base, $replacement);
// Alternatively use array merge for php < 5.3
// array_merge($replacement, $base);
}
}
和array_replace()
函数都在更新值并执行初始目标,但问题是我仍然继续获取该参数(array_merge()
)不是数组问题。
警告:array_replace()[function.array-replace]:参数#1不是...中的数组
任何有关更好地解决此问题的方法的建议都将是有价值的帮助:) 谢谢你的帮助:)
编辑:$base
是我用来代替in_array_find()
的函数,因为它不适用于在多维数组中查找值:特别是2个深度数组:
从here找到它,它对我有用
它的代码是:
in_array()
答案 0 :(得分:1)
array_replace
返回被替换的数组。所以你需要这样做:
$base=array_replace($base, $replacement);
另外,我建议始终使用命名键,而不是混合命名和数字:
$base = $_SESSION['cart'][$to_update]['quantity'];
修改强>
这可能不是你想要的......
我在不使用$ _SESSION的情况下设置了测试情况,并且我遇到了同样的错误。我按如下方式更改了代码,不再收到错误。
$sesh=array(
'cart'=>array(
0=>array(
'quantity'=>1
)
)
);
$to_update=0;
$new_quantity=5;
//$base = $sesh['cart'][$to_update]['quantity']; <--- changed this to line below
$base = $sesh['cart'][$to_update];
$replacement = $sesh['cart'][$to_update] = array('quantity' => $new_quantity);
$base=array_replace($base, $replacement);
echo"<pre>";print_r($base);echo"</pre>";
PHP FIDDLE:http://phpfiddle.org/main/code/mvr-shr
答案 1 :(得分:1)
这解决了这个问题:
基本上按照结构:(让它切成小块)
$_SESSION['cart'] = array();
然后
$_SESSION['cart'][$name] = array('quantity' => 1);
最后:
$base = $_SESSION['cart'][$to_update]['quantity'] ;
$replacement = $_SESSION['cart'][$to_update] = array('quantity' => $_POST['option']);
array_replace($base, $replacement);
它说参数$base
不是数组的原因是:
['quantity']
中的{p> $base
不是数组,因为它构成'quantity' => 1
我们需要的array()
来自array('quantity' => 1);
的值,以便识别它作为一个数组。
所以最终答案应该是:$base = $_SESSION['cart'][$to_update];
因为array()
所在的位置只记录了一个$to_update
,所以替换参数将替换此识别的数组。
答案 2 :(得分:0)
$_SESSION
仅在Session starts时存在。为此,您需要添加所有代码session_start()
,否则会话将无法启动,除非您在php directives上定义。