2012-02-08 111 views
0

說我有一個名爲set_session_variable功能,看起來像:設置PHP多維會話變量

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'; 
+1

請解釋一下,要檢索富怎麼辦。首先你將foo設置爲bar。在這一點上,'foo'是一個字符串。接下來你把'foo [bar] [baz]'設置爲無效。你現在期望什麼樣的行爲?你是否想將'foo'從字符串轉換爲數組(例如'foo [bar] [blaz]'具有值blah)?或$ _SESSION ['foo']給你數組,使$ _SESSION ['foo'] ['bar'] ['baz'] =='blah? – 2012-02-08 15:02:38

+0

我已經更新了我的問題,以便更清楚地告訴我如何編寫$ _SESSION變量。在這一點上,我並沒有太在意設置變量。 – 2012-02-08 15:06:47

回答

2

我強烈建議,您不會使用

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

而是

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

此外,你並不需要在所有的函數調用爲:

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

可以更改$_SESSION實施與session save handler

如果您只關心如何解析像'foo[bar][baz]'這樣的字符串,那麼之前會詢問這個字符串,例如use strings to access (potentially large) multidimensional arrays。要解決這個

+0

我的函數的關鍵在於抽象整個過程,以便我不必直接與$ _SESSION變量進行交互 – 2012-02-08 15:08:05

+1

您只使用全局函數,而您甚至可以改變在非全局函數中交互的方式,標準的方式(只有''__SESSION'在那裏,我很確定)。無論如何,你會看到第二個示例代碼行和鏈接的問題/答案。兩者都應該適合你的需求。 – hakre 2012-02-08 15:13:46

-1

一種方法是模仿函數重載,例如在這個崗位 - >PHP function overloading

另一種方式是一個字符串參數添加到您的功能,與你的分隔數組索引。 例如:set_session_variable('foo','bar','baz; key'); 將'bar'值保存到foo ['baz'] ['key']中。

所有你需要做的是撕開第三個參數(我使用;作爲分隔符在這裏)。

1

一個更相關的問題是爲什麼你需要一個函數。函數調用有成本,並且函數似乎沒有做有用的工作。

實例分配:

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

在直接回答你的問題:你可以解析$名set_session_variable()內使用PCRE模塊和正則表達式的值。

即使更簡單也更快速的解決方法是使用sscanf(),前提是您能夠並願意對數組鍵的命名施加約定。

的清潔替代功能:

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