3

私は学校のプロジェクト用にこのコードを持っていて、コードが私がやりたいことを実行していると思っていましたが、 $_SESSION[] is not a array argument を使用しているときにエラーが発生し続けています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()値を更新し、最初の目標が何であったかを実行していることに注意してください$base

警告: array_replace() [function.array-replace]: 引数 #1 は配列ではありません ...

この問題に取り組むためのより良い方法についての提案は、貴重な助けになるでしょう:)助けてくれてありがとう:)

編集:これは、多次元配列の値の検索には適用されないin_array_find()ため、代わりに使用する関数です:具体的には2つの深さ配列:in_array()

ここから見つけて、それは私のために働きます

そのコードは次のとおりです。

// 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 フィドル: 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]; は1つだけであるため、置換引数はこの識別された配列を置き換えます。array()$to_update

于 2013-04-26T22:58:03.363 に答える
0

$_SESSIONセッションの開始時にのみ存在します。そのためには、すべてのコードの上に追加する必要があります。そうしないと、 php ディレクティブsession_start()で定義しない限り、セッションは開始されません。

于 2013-04-26T21:53:00.730 に答える