2010-02-09 40 views
41

我有一个用于变量添加到会话PHP代码:如何从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> 

我想删除了在$list2从会话阵列时显示的变量用户选择'删除'。

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

如何删除一个变量?

+1

可以将PHP文件里没有代码的HTML,而无需调用'echo'事前,即'回声“<表格名称=“输入“action =”index ..“>'' – 2010-02-09 18:14:02

+3

@Anthony如果它不在标签内,则可以。 – GSto 2010-02-09 18:26:11

+0

D'oh!我没有看到它不是*(额头上的手掌)* – 2010-02-09 18:31:23

回答

46
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']是一个数组,你需要找到一个指向名称值你感兴趣的阵列的关键。最后一行重新排列数组的索引,以便下次使用。

39

为了从会话中使用的删除特定变量:

session_unregister('variableName'); 

see documentation)或

unset($_SESSION['variableName']); 

注: session_unregister()已被弃用的PHP 5.3.0和除去的PHP 5.4.0。

+0

它将从阵列中删除所有值,而不是单曲:( – LiveEn 2010-02-09 19:26:39

+0

)如果您试图“放下”/“未设置”的变量是一个数组, ($ _SESSION ['myarray'] = array('key'=> val,'key2'=> val2); usnet($ _ SESSION ['myarray']将取消设置数组...'但是 未设置($ _ SESSION ['myarray'] ['key2']将删除第二个数组元素 - (键值)对 – Andreas 2010-02-09 22:32:07

+3

session_unregister()“此功能自PHP 5.3.0开始已被拒绝, 5.4.0。“ – Lamy 2012-10-11 11:55:20

0

试试这个:

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

目前你正在清理名称数组,你需要调用数组,那么你想在阵列内撤消该指数:

$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

4

$ _SESSION ['name']变量是一个数组吗?如果要从数组中删除特定的键,则必须在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表单混合在一起。是否有任何理由不能在隐藏字段中传递'姓名'的表单?最好不要混合获取和发布变量,尤其是在其他地方使用$ _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()调用。如果任一$列表1或$ list2中包含双引号(“),它会破坏你的HTML

1

如果你想删除或取消所有$ _SESSION的那就试试这个

session_destroy(); 

如果要删除特定$ _SESSION [“名”]那就试试这个

session_unset('name');