【问题标题】:How to remove a variable from a PHP session array如何从 PHP 会话数组中删除变量
【发布时间】:2011-01-14 22:30:01
【问题描述】:

我有用于向会话添加变量的 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 中显示的变量。

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

我怎样才能只删除一个变量?

【问题讨论】:

  • @Anthony 如果它不在 标签内,你可以。
  • 天啊!我没看到不是(手掌放在额头上)

标签: php arrays session


【解决方案1】:
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']是一个数组,你需要找到指向你感兴趣的名称值的数组键。最后一行重新排列了数组的索引以备下次使用。

【讨论】:

    【解决方案2】:

    要从会话中删除特定变量,请使用:

    session_unregister('variableName');
    

    (see documentation) 或

    unset($_SESSION['variableName']);
    

    注意: session_unregister() 自 PHP 5.3.0 起已弃用,自 PHP 5.4.0 起已删除。

    【讨论】:

    • 它从数组中删除所有值,而不是单数:(
    • 如果您尝试“删除”/“取消设置”的变量是一个数组,那么该数组将被删除。例如$_SESSION['myarray'] = array('key'=>val,'key2'=>val2); usnet($_SESSION['myarray'] 将取消设置数组...但是 unset($_SESSION['myarray']['key2'] 将删除第二个数组元素 - (key,value) 对
    • session_unregister() "这个函数从 PHP 5.3.0 开始被弃用,从 PHP 5.4.0 开始被移除。"
    • 使用未设置 ($_SESSION["name"]);
    【解决方案3】:

    $_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
    

    您的 sn-p 的另一个小问题:您将 GET 查询参数与 POST 表单混合在一起。有什么理由不能在隐藏字段中传递“名称”的表格吗?最好不要混用 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() 调用。如果 $list1 或 $list2 包含双引号 ("),它将破坏您的 HTML

    【讨论】:

      【解决方案4】:

      如果您想删除或取消设置所有 $_SESSION ,请尝试此操作

      session_destroy();
      

      如果您想删除特定的 $_SESSION['name'],请尝试此操作

      session_unset('name');
      

      【讨论】:

        【解决方案5】:

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

        $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>';
        ?> 
        

        所以,未设置对内部数组计数器没有影响!!!

        http://us.php.net/unset

        【讨论】:

          【解决方案6】:

          试试这个:

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

          【讨论】:

            【解决方案7】:

            只需使用此方法。

            <?php
                $_SESSION['foo'] = 'bar'; // set session 
                print $_SESSION['foo']; //print it
                unset($_SESSION['foo']); //unset session 
            ?>
            

            【讨论】:

              猜你喜欢
              • 2018-01-10
              • 1970-01-01
              • 2016-11-30
              • 2015-08-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-10-19
              • 1970-01-01
              相关资源
              最近更新 更多