在PHP中,我经常做以下事情:
$_SESSION['var']['foo'] = array('bar1' => 1, 'bar2' => 2);
// ...
$_SESSION['var']['foo']['bar2'] = 3;
// ...
echo $_SESSION['var']['foo']['bar2']; // 3
我想知道在与Kohana的会话中存储多维数组的推荐方法。
我知道我可以执行以下操作,但我不知道如何使其适用于多维,特别是获取部分:
Session::instance()->set('var', array(
'foo' => array(
'bar1' => 1,
'bar2' => 2,
),
));
// ...
// how do I set just bar2?
// ...
// this gets the whole array, but how do I get just bar2?
Session::instance()->get('var');
所以,问题是:
有没有办法在Kohana 3中做其中任何一个?
我很乐意使用本机会话,但我们正在尝试使用数据库会话。
答案 0 :(得分:4)
简短的回答是,鉴于目前Kohana会议的实施,没有办法做到这一点。您有两种选择:
获取并设置整个数组,每次编辑所需的位:
$array = Session::instance()->get('var');
$array['foo']['bar2'] = 'baz';
Session::instance()->set('var', $array);
或者您覆盖Kohana_Session-> get()和 - > set()方法(定义为here on github)。 请记住,鉴于Kohana中精彩的“分层”文件系统,您实际上可以扩展类,只需修改所需的方法,而无需编辑核心Kohana代码。
我的想法是更改$key
参数以接受字符串或数组。如果传入一个数组,它应该将数组中的每个元素解释为“更深”的级别。
$key = array('var', 'foo', 'bar2');
Session::instance()->get($key, $default);
Session::instance()->set($key, 'baz');
答案 1 :(得分:3)
$session = & Session::instance()->as_array();
$session['foo']['bar2'] = 'baz';
UPD。此外,您可以使用Arr::path()
:
$bar2 = arr::path(Session::instance()->as_array(), 'foo.bar2');// returns 'baz'
$bars = arr::path(Session::instance()->as_array(), '*.bar2'); // returns array of bar2's