如何在 laravel 中的会话中删除单个命令中的多个密钥


How to remove multiple key at a single command from session in laravel

假设我有一个会话数组,如下所示

array(
     'boking' = array(
                    'index1' => 'value1'
                    'index2' => 'value2'
               ),
     'return' = array(
                    'index1' => 'value1'
                    'index2' => 'value2'
               ),
     'search' = array(
                    'index1' => 'value1'
                    'index2' => 'value2'
               )
)

现在我想删除bokingsearch

要完成此任务,我尝试了

Session::forget('boking');
Session::forget('search');

它工作正常。

但是我想在一个命令中删除这个多键。是否有可能在一个命令中做到这一点?

根据源代码Session::forget定义为

/**
 * Remove an item from the session.
 *
 * @param string $key
 * @return void
 */
 public function forget($key)
 {
     array_forget($this->attributes, $key);
 }

array_forget函数定义为

/**
 * Remove one or many array items from a given array using "dot" notation.
 *
 * @param array $array
 * @param array|string $keys
 * @return void
 */
 function array_forget(&$array, $keys)
 {
     return Arr::forget($array, $keys);
 }

由于Session::forget不会对$key强制执行任何类型的内容,而是将您传递给它的任何内容传递给接受array|string $keys array_forget,因此您应该能够执行

Session::forget(['boking', 'search']);

但是,由于Session::forget没有将array列为$key的可能值,并以单数形式显式命名参数,因此不应依赖该行为。它可能会改变。再说一次,它也可能只是一个文档错误。考虑和拉拉维尔的家伙开一张票。

为了完整和参考,这里是要Arr::forget的代码:

/**
 * Remove one or many array items from a given array using "dot" notation.
 *
 * @param  array  $array
 * @param  array|string  $keys
 * @return void
 */
public static function forget(&$array, $keys)
{
    $original =& $array;
    foreach ((array) $keys as $key)
    {
        $parts = explode('.', $key);
        while (count($parts) > 1)
        {
            $part = array_shift($parts);
            if (isset($array[$part]) && is_array($array[$part]))
            {
                $array =& $array[$part];
            }
        }
        unset($array[array_shift($parts)]);
        // clean up after each pass
        $array =& $original;
    }
}

您可以尝试以下代码:

Session::forget(['test1', 'test2']);