我正在尝试创建一个PHP Session Wrapper类并且要做 - 为了使其灵活,我需要能够像这样动态创建会话关联数组:
'basket' => array(
27 => array(
'colour' => 'blue',
'qty' => 2,
'price' => 20.50
)
)
设置会话的方法是通过调用:
Session::set(array('basket', $item_id, 'colour'), 'blue');
Session::set(array('basket', $item_id, 'qty'), 2);
Session::set(array('basket', $item_id, 'price'), 20.50);
现在 - 我真的不确定如何从set()方法的第一个参数创建会话关联数组。
这可能只是一个项目或4个以上 - 这个想法是让它变得动态 - 无论第一个数组参数中的项目数量是多少。
知道如何实现这一目标?
答案 0 :(得分:3)
这有什么不妥?
$_SESSION['basket'] = array(
27 => array(
'colour' => 'blue',
'qty' => 2,
'price' => 20.50));
我认为你正试图解决一个不存在的问题。您的会话类提供的PHP会话功能不具备哪些功能?
答案 1 :(得分:1)
这样的事情:
public function set($key, $arrayOrVar) {
$_SESSION[$key] = $arrayOrVar;
return $_SESSION[$key];
}
??只需发送一个数组就会对它进行会话化(< - 我完全对该术语进行了版权保护)
也许我误解了,是否有任何理由让你的会话类做所有数组的混乱工作,而这似乎应该是你的代码的工作,而不是你永远不会改变的标准包含。
答案 2 :(得分:1)
我想我明白你在说什么。以下代码很乱,但它是一个概念证明。您建议的方法允许您重置更深的值而不重置整个阵列,我相信这可以完成(阵列中最多四个键)。您需要进行一些验证以确保实际设置数组索引以防止任何错误,但在此之后它将正常工作。
class SessionWrapper
{
public static function set($key, $value)
{
if (is_array($key)) {
$keyCount = count($key);
switch ($keyCount) {
case 1:
$_SESSION[$key[0]] = $value;
break;
case 2:
$_SESSION[$key[0]][$key[1]] = $value;
break;
case 3:
$_SESSION[$key[0]][$key[1]][$key[2]] = $value;
break;
case 4:
$_SESSION[$key[0]][$key[1]][$key[2]][$key[3]] = $value;
break;
default:
return false;
break;
}
return true;
}
$_SESSION[$key] = $value;
return true;
}
}
// single level
SessionWrapper::set('veggies', array(
$veg_id => array(
'color' => 'green'
)
));
// three keys deep
SessionWrapper::set(array('veggies', $veg_id, 'color'), 'green');
// four keys deep
SessionWrapper::set(array('states', 'PA', 'senators', 1), 'Robert Casey');
// array(
// 'states' => array(
// 'PA' => array(
// 'senators' => array(
// 1 => 'Robert Casey'
// )
// )
// )
// )