2011-09-30 13 views

答えて

2
$matches = preg_grep('/^cart_/', array_keys($_SESSION)); 
foreach ($matches as $match) { 
    unset($_SESSION[$match]); 
} 
+0

このスクリプトは魔法と似ています。それは完全に動作します!あなたのスクリプトが何をしているか尋ねてもいいですかstrpos($ key、 "cart_")=== 0または$ getcartname =(explode( '_'、$ key))の使用とどのように違うのですか? if($ getcartname [0] == 'カート'); – JohnSmith

+0

preg_grepは、配列の各メンバ(この場合は$ _SESSIONのキー)に正規表現を適用し、一致する要素を新しい配列に返します。だから、 '$ matches'はあなたのセッションで' cart_XXX'のキー名をすべて含んでいます。次に、それらのセッション変数のそれぞれを設定解除する単純なループ。 –

7

あなたは同じことarray_keys()を使用して

foreach ($_SESSION as $key=>$val) { 
    // Look for "cart_" at the front of the array key 
    if (strpos($key, "cart_") === 0) { 
    unset($_SESSION[$key]); 
    } 
} 

など何かができる:

foreach (array_keys($_SESSION) as $key) { 
    // Look for "cart_" at the front of the array key 
    if (strpos($key, "cart_") === 0) { 
    unset($_SESSION[$key]); 
    } 
} 

補遺

私もデザインの提案を行うことができる場合は、これを変更する機能を持っている場合構造体ではなく、これらのカートアイテムを配列として格納することをお勧めします。配列は、内部に含まれる項目IDを値として保持します。

foreach ($_SESSION['cart'] as $item=>$quantity) { 
    // process the cart  
} 
+0

多分あなたは===使用する必要があると動作しませんではない== – mishu

+1

。 strposで '==='を使う必要があります。マニュアルページに、これに関する大きな警告(http://php.net/manual/en/function.strpos.php)があります! – awm

+0

よりはるかに安全であるため、将来使用する可能性がある「cart_type」などの変数を削除しないでください。アンダースコアで爆発する可能性があり、結果に2つの要素が含まれていれば、最初は「カート」、 1つはint値で、次にそれを削除します – mishu

1

項目が1つしかないで格納される$ SESSION [ 'カート':

// Updated after comments.... 
$_SESSION['cart'] = array(); 
// Add to cart like this: 
$_SESSION['cart'][$itemId] = $new_quantity; 

これは、簡単のようなものを行うにはなるだろう。 $ itemId]の内容を変更しない限り、$ itemId]とにかく

、必ずその設定を解除することができます

if (isset($_SESSION['cart_' . $itemId])) { // don't need this if you are iterating through $_SESSION 
    unset($_SESSION['cart_' . $itemId]); 
} 
+0

$ itemidは実際には変数です。申し訳ありません、私はそれを投稿するのを忘れました。私は、 'cart_'で始まるインデックスを持つすべてのセッション変数を削除することを目指しています。 $ itemidには任意の英数字を使用できます。 – JohnSmith

関連する問題