3

我有这个代码用于我的学校项目,并认为代码可以按照我想要的方式完成工作,但在使用array_replace()andarray_merge()函数时,我仍然不断收到关于 $_SESSION[] is not an array argument 的错误:

会话已在标头上启动:

 // 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()在更新值并执行最初的目标,但问题是我仍然继续得到一个参数($base)不是数组问题。

警告:array_replace() [function.array-replace]:参数 #1 不是 ...

任何有关解决此问题的更好方法的建议都将是宝贵的帮助:) 感谢您的帮助:)

编辑:这in_array_find()是我用来替换的函数,in_array()因为它不适用于在多维数组中查找值:特别是 2 个深度数组:

这里找到它,它对我有用

它的代码是:

// Function for searching values inside a multi array:
function in_array_find($needle, $haystack, $strict = false) {
foreach ($haystack as $item => $arr) {
    if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
        return true;
    }
}

return false;
}
4

3 回答 3

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

于 2013-04-26T22:05:33.397 回答
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']in$base不是一个数组,因为它形成了'quantity' => 1我们需要的array()值,array('quantity' => 1);以便将其标识为一个数组。

所以最终的答案应该是:$base = $_SESSION['cart'][$to_update]; 因为只有一个array()记录在其中,$to_update所以替换参数应该替换这个标识的数组。

于 2013-04-26T22:58:03.363 回答
0

$_SESSION仅在Session 开始时存在。为此,您需要在所有代码之上添加,session_start()否则会话将不会启动,除非您在php directives上定义它。

于 2013-04-26T21:53:00.730 回答