PHP动态创建$ _SESSION关联数组

时间:2011-04-03 18:36:51

标签: php arrays class session

我正在尝试创建一个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个以上 - 这个想法是让它变得动态 - 无论第一个数组参数中的项目数量是多少。

知道如何实现这一目标?

3 个答案:

答案 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'
//             )
//         )
//     )
// )