如何从PHP会话数组中删除一个variables

我有用于添加variables到会话的PHP代码:

<?php session_start(); if(isset($_GET['name'])) { $name = isset($_SESSION['name']) ? $_SESSION['name'] : array(); $name[] = $_GET['name']; $_SESSION['name'] = $name; } if (isset($_POST['remove'])) { unset($_SESSION['name']); } ?> <pre> <?php print_r($_SESSION); ?> </pre> <form name="input" action="index.php?name=<?php echo $list ?>" method="post"> <input type="submit" name ="add"value="Add" /> </form> <form name="input" action="index.php?name=<?php echo $list2 ?>" method="post"> <input type="submit" name="remove" value="Remove" /> </form> 

我想在用户select“删除”时从会话数组中删除显示在$list2中的variables。

但是当我取消设置时,数组中的所有variables都将被删除。

我怎样才能删除一个variables?

 if (isset($_POST['remove'])) { $key=array_search($_GET['name'],$_SESSION['name']); if($key!==false) unset($_SESSION['name'][$key]); $_SESSION["name"] = array_values($_SESSION["name"]); } 

由于$_SESSION['name']是一个数组,因此您需要find指向您感兴趣的名称值的数组键。最后一行重新排列数组的索引以供下次使用。

要从会话中删除特定的variables,请使用:

 session_unregister('variableName'); 

( 见文档 )或

 unset($_SESSION['variableName']); 

注意: session_unregister()从PHP 5.3.0开始已经被拒绝,从PHP 5.4.0开始已经被删除了。

$ _SESSION ['name']variables是一个数组吗? 如果要从数组中删除特定的键,则必须在unset()调用中引用该确切键,否则删除整个数组,例如

 $name = array(0 => 'a', 1 => 'b', 2 => 'c'); unset($name); // deletes the entire array unset($name[1]); // deletes only the 'b' entry 

你的代码片段的另一个小问题:你正在将GET查询参数与POST表单混合在一起。 你有什么理由不能在隐藏字段中传递“姓名”的forms吗? 最好不要混合get和postvariables,特别是如果你在其他地方使用$ _REQUEST。 试图找出为什么$ _GET ['name']不会像$ _POST ['name']一样显示,因为服务器在'variables_order'中设置了不同的EGPCS顺序, .ini设置。

 <form blah blah blah method="post"> <input type="hidden" name="name" value="<?= htmlspecialchars($list1) ?>" /> <input type="submit" name="add" value="Add /> </form> 

并注意htmlspecialchars()调用。 如果$ list1或$ list2包含一个双引号(“),它会破坏你的HTML

目前您正在清除名称数组,您需要调用该数组,然后在数组中指定要取消设置的索引:

 $ar[0]==2 $ar[1]==7 $ar[2]==9 unset ($ar[2]) 

在数组中取消设置值的两种方法:

 <?php # remove by key: function array_remove_key () { $args = func_get_args(); return array_diff_key($args[0],array_flip(array_slice($args,1))); } # remove by value: function array_remove_value () { $args = func_get_args(); return array_diff($args[0],array_slice($args,1)); } $fruit_inventory = array( 'apples' => 52, 'bananas' => 78, 'peaches' => 'out of season', 'pears' => 'out of season', 'oranges' => 'no longer sold', 'carrots' => 15, 'beets' => 15, ); echo "<pre>Original Array:\n", print_r($fruit_inventory,TRUE), '</pre>'; # For example, beets and carrots are not fruits... $fruit_inventory = array_remove_key($fruit_inventory, "beets", "carrots"); echo "<pre>Array after key removal:\n", print_r($fruit_inventory,TRUE), '</pre>'; # Let's also remove 'out of season' and 'no longer sold' fruit... $fruit_inventory = array_remove_value($fruit_inventory, "out of season", "no longer sold"); echo "<pre>Array after value removal:\n", print_r($fruit_inventory,TRUE), '</pre>'; ?> 

所以,unset对内部数组计数器没有任何影响!

http://us.php.net/unset

如果你想删除或取消设置所有的$ _SESSION的,那么试试这个

 session_destroy(); 

如果你想删除特定的$ _SESSION ['name'],那么试试这个

 session_unset('name'); 

试试这个:

 if(FALSE !== ($key = array_search($_GET['name'],$_SESSION['name']))) { unset($_SESSION['name'][$key]); }