PHP динамически создает ассоциативный массив $ _SESSION - PullRequest
1 голос
/ 03 апреля 2011

Я пытаюсь создать PHP Session Wrapper Class и сделать это - для того, чтобы сделать его гибким, мне нужно иметь возможность динамически создавать сессионный ассоциативный массив, например, так:

'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 ().

Это может быть только один элемент или более четырех, представленных здесь - идея состоит в том, чтобы сделать его динамическим - независимо от количества элементов в первом параметре массива.

Есть идеи, как этого достичь?

Ответы [ 3 ]

3 голосов
/ 03 апреля 2011

Что в этом плохого?

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

Я думаю, что вы пытаетесь решить проблему, которой не существует. Какую функциональность предлагает ваш класс сеанса, чего нет в средствах сеанса PHP?

1 голос
/ 03 апреля 2011

Мне кажется, я понимаю, что вы говорите.Следующий код грязный, но это доказательство концепции.Метод, который вы предлагаете, позволяет вам сбросить более глубокое значение, не сбрасывая весь массив, что, я считаю, это выполняет (до четырех ключей в массиве).Вам нужно будет выполнить некоторую проверку, чтобы убедиться, что индексы массива действительно установлены для предотвращения любых ошибок, но после этого все будет работать нормально.

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'
//             )
//         )
//     )
// )
1 голос
/ 03 апреля 2011

Примерно так:

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

?? Просто отправьте ему массив, и он сессионизирует его (<- я полностью защищаю этот термин авторским правом) </p>

Может быть, я неправильно понял, есть ли причина, по которой ваш класс сеанса выполняет всю работу с массивами, когда кажется, что это должна быть работа вашего кода, а не ваши стандартные включения, которые никогда не меняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...