在函数中设置PHP多维会话变量

时间:2012-02-08 14:47:50

标签: php

假设我有一个名为set_session_variable的函数,它看起来像:

function set_session_variable($name, $value) {
    // ...write value to the specified path 
}

我将如何编写此函数(不使用eval)以便我可以执行以下操作:

set_session_variable('foo', 'bar'); // Would set $_SESSION['foo'] = 'bar'; 
set_session_variable('foo[bar][baz]', 'blah'); // Would set $_SESSION['foo']['bar']['baz'] = 'blah';

3 个答案:

答案 0 :(得分:2)

我强烈建议您不要使用

set_session_variable('foo[bar][baz]', 'blah');

但是

set_session_variable('foo', array('bar'=>array('baz' => 'blah')));

此外,根本不需要函数调用:

$_SESSION['foo']['bar']['baz'] = 'blah';

您可以使用session save handler更改$_SESSION的实施。

如果你只关心如何解析像'foo[bar][baz]'这样的字符串,那么之前就会问过这个问题,例如use strings to access (potentially large) multidimensional arrays

答案 1 :(得分:1)

一个更相关的问题是你需要一个功能的原因。函数调用具有成本,并且该函数似乎没有做有用的工作。

示例作业:

$_SESSION['foo'] = 'bar';
$_SESSION['foo']['bar']['baz'] = 'blah';
$foo['bar']['baz'] = 'blah';
$_SESSION['foo'] = $foo;

直接回答你的问题:你可以使用PCRE模块和正则表达式解析set_session_variable()中$ name的值。

如果您能够并且愿意在数组键的命名上强加约定,那么使用sscanf()解析它会更简单,更快。

更清洁的替代功能:

$array['bar']['baz'] = 'blah';
set_session_variable('foo', $array);
function set_session_variable($key, $val) {
    $_SESSION[$key] = $val;
}

答案 2 :(得分:-1)

解决此问题的一种方法是模仿函数重载,例如本文中的> PHP function overloading

另一种方法是在函数中添加一个字符串参数,并以数组索引分隔。 例如:set_session_variable(' foo',' bar',' baz; key'); 这节省了价值' bar'进入foo [' baz'] [' key']。

你所要做的就是撕开第三个参数(我使用;作为分隔符)。