Php 在symfony/httpfoundation中设置/删除多维数组

Php 在symfony/httpfoundation中设置/删除多维数组,php,symfony,session,Php,Symfony,Session,我正在使用httpfoundation 我正在用这个替换所有的$\u会话s 即 $\u会话['user']='foo'变成$this->SESSION->set('user',foo') 使用会话类 我在使用多维数组时遇到问题 通过执行以下操作,我可以获得正确的数据: $this->Session->get('user')['group']['id'] 但是,当我想将深度数组设置/删除为某个值时,我没有办法这样做 $this->Session->set(array('

我正在使用httpfoundation

我正在用这个替换所有的
$\u会话
s

$\u会话['user']='foo'
变成
$this->SESSION->set('user',foo')
使用会话类


我在使用多维数组时遇到问题

通过执行以下操作,我可以获得正确的数据:

$this->Session->get('user')['group']['id']
但是,当我想将深度数组设置/删除为某个值时,我没有办法这样做

$this->Session->set(array('user' => array('group' => 'id')), 200); // Errors

$this->Session->remove(array('form_data' => 'test')); // Errors
肯定有一种干净的方法可以做到这一点吗?我认为甚至不可能使用httpfoundation会话术语设置深层数组值

这些似乎是我唯一可以使用的方法:

all()
keys()
replace()
add()
get()
set()
has()
remove()
如果我不够清楚就喊,干杯


遵循Matt的答案的新方法。

设置测试的值
$Session->set('test',array('test1'=>array('test2'=>array('test3'=>'test4'))

运行方法
$Session->setDeep('test',array('test1','test2','test3'),'flip')
$Session->removeDeep('test',array('test1','test2','test3')

方法是:

/**
 * Removes a deep variable item
 * @param string $key   Top-most array key value
 * @param array $path  one-dimentional array of path: array('user', 'group', 'id')
 */
public function removeDeep($key, $path)
{
  $new_arr = $this->get($key);
  $depth = count($path);

  switch ($depth) {
    case 1:
      return false;
      break;
    case 2:
      unset( $new_arr[$path[0]][$path[1]] );
      break;
    case 3:
      unset( $new_arr[$path[0]][$path[1]][$path[2]] );
      break;
    case 4:
      unset( $new_arr[$path[0]][$path[1]][$path[2]][$path[3]] );
      break;
  }
  $this->set($key, $new_arr);
}

/**
 * Sets a deep variable item
 * @param string $key   Top-most array key value
 * @param array $path  one-dimentional array of path: array('user', 'group', 'id')
 * @param mixed $value The value you will set the path to
 */
public function setDeep($key, $path, $value)
{
  $new_arr = $this->get($key);
  $depth = count($path);

  switch ($depth) {
    case 1:
      return false;
      break;
    case 2:
      $new_arr[$path[0]][$path[1]] = $value;
      break;
    case 3:
      $new_arr[$path[0]][$path[1]][$path[2]] = $value;
      break;
    case 4:
      $new_arr[$path[0]][$path[1]][$path[2]][$path[3]] = $value;
      break;
  }
  $this->set($key, $new_arr);
}

set
的第一个参数视为顶级会话数组的键。而不是

$this->Session->set(array('user' => array('group' => 'id')), 200);
你想要

$this->Session->set('user', array('group' => array('id' => 200)));
请记住,这意味着如果要更改单个值,必须获取完整数组,更改该值,然后重新设置:

$user = $session->get('user');
$user['group']['id'] = 300;
$session->set('user', $user);

会话
类的一个有趣的更改是扩展PHP的
ArrayObject
,这样您就可以像本地数组一样获取和设置深度值。您可以随时扩展
会话
并自己进行扩展。

我认为这会删除“用户”下的任何其他元素,对吗?用户将在其下方具有多个数组值。如果我使用这个,那么它将有组值,但失去所有其他值?谢谢你,顺便说一句,我不知道它是这样工作的是的,没错。请参阅我的上一次编辑。您可能仍然需要一个自定义方法来更改深度值,但是您必须获取整个数组,更改值,并设置整个数组。谢谢Matt-works!我将用新的方法更新我的问题,这些方法在我完成后会这样做。干杯