【问题标题】:PHP dynamically created $_SESSION associative arrayPHP 动态创建 $_SESSION 关联数组
【发布时间】:2011-07-28 17:54:04
【问题描述】:

我正在尝试创建一个 PHP 会话包装类并执行此操作 - 为了使其灵活,我需要能够像这样动态创建会话关联数组:

'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 个 - 想法是使其动态 - 无论第一个数组参数中的项目数如何。

知道如何实现吗?

【问题讨论】:

    标签: php arrays class session


    【解决方案1】:

    这有什么问题?

    $_SESSION['basket'] = array(
         27 => array(
            'colour' => 'blue',
            'qty' => 2,
            'price' => 20.50));
    

    我认为您正在尝试解决一个不存在的问题。您的会话类提供了 PHP 的会话设施不提供的哪些功能?

    【讨论】:

    • 这没有什么问题——除了我正在创建包装类——因此我想让它更灵活、更易于使用。
    • 我认为他的意思是:Session::set(array('basket', $item_id, 'colour'));与 $_SESSION['myArray'] = array('basket', $item_id, 'colour'); 完全相同他想知道包装类在 PHP 的正常会话处理中没有做什么,这将包括重做 PHP 已经为您完成的所有工作的原因。
    • 如果只是为了防止在session_start()中编码;在每一页的开头,只需将它添加到你的头文件中,瞧。
    【解决方案2】:

    我想我明白你在说什么。下面的代码很乱,但它是一个概念证明。您建议的方法允许您在不重置整个数组的情况下重置更深的值,我相信这可以完成(数组中最多四个键)。您需要进行一些验证以确保实际设置了数组索引以防止任何错误,但之后它会正常工作。

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

    【讨论】:

    • 这是来自$_SESSION['states']['PA']['senators'][1] = 'Robert Casey';的可取之处吗?
    • 是的 - 实际上是 - 当您不太清楚可能有多少物品时,在某些情况下更容易管理 - 我知道不是每个人都需要它,但这正是我申请的目的。仍然 - 我仅限于手动定义的案例数量,所以如果数组有超过 4 个项目的机会,那么我将不得不创建额外的案例,但它现在就可以了。感谢您的投入 - 非常感谢!
    【解决方案3】:

    类似这样的:

    public function set($key, $arrayOrVar) {
       $_SESSION[$key] = $arrayOrVar;
       return $_SESSION[$key];
       }
    

    ??只需向它发送一个数组,它就会对其进行会话(

    也许我误解了,你的会话类是否有任何理由做所有的数组混杂工作,而这似乎应该是你的代码的工作,而不是你的标准包括永远不会改变的工作。

    【讨论】:

    • 我试图通过调用 Session::set(array('basket', $item_id, 'color'), 'blue');是 $_SESSION['basket'][$item_id]['colour'] = 'blue'
    猜你喜欢
    • 2014-10-22
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2017-12-17
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多