Php 在symfony/httpfoundation中设置/删除多维数组
我正在使用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('
$\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!我将用新的方法更新我的问题,这些方法在我完成后会这样做。干杯