array_replace()/ array_merge()| ($ _SESSION = array())参数不是数组?

时间:2013-04-26 21:19:31

标签: php arrays session session-variables

我有我的学校项目的代码,并认为代码完成了我想要它做的工作,我仍然继续得到关于$ _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()

3 个答案:

答案 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上定义。