Как отображать динамические переменные сеанса в PHP?

Страница заказа. На этой странице клиенты могут добавлять заказы с визитными карточками на разных иностранных языках и другими параметрами.

Когда пользователь нажимает кнопку, чтобы добавить дополнительную карточку, javaScript добавляет ряд полей формы, и чтобы дать им уникальные атрибуты имени, я просто добавляю переменную-счетчик в конце имени для каждой группы полей, поэтому Я могу сохранить их как уникальную группу переменных сеанса, где каждое поле формы имеет разные имена, но один и тот же номер счетчика в конце, поэтому я знаю, что они связаны друг с другом.

Это переменные сеанса, которые я сохраняю, когда пользователь отправляет форму для перехода на следующую страницу:

  • $_SESSION[количество1] = 500
  • $_SESSION[language1] = Корейский
  • $_SESSION[количество2] = 250
  • $_SESSION[language2] = Китайский

Страница оформления заказа. Я хочу, чтобы на этой странице отображалась информация для каждой заказанной карты.

Я пытаюсь вывести все переменные сеанса с одинаковым номером в конце переменной сеанса на странице оформления заказа. До сих пор я использую цикл foreach для отображения всех переменных сеанса, но я пытаюсь вывести только те, у которых в конце имен есть «1» или «2» в конце имен. и т. д., и сгруппируйте их вместе.

Так что в идеале я хотел бы что-то вроде этого:

Заказ №1,
Количество: 500,
Язык на карте: корейский

Заказ №2,
Количество: 250,
Язык на карте: Китайский

Как я могу отобразить и сгруппировать эти динамические переменные сеанса на странице оформления заказа?


person zeckdude    schedule 04.02.2010    source источник


Ответы (3)


Вместо этого измените структуру сеанса при сохранении в него:

  • $_SESSION[заказ][1][количество] = 500
  • $_SESSION[заказ][1][язык] = корейский
  • $_SESSION[заказ][2][количество] = 250
  • $_SESSION[заказ][2][язык] = Китайский

Таким образом, вы можете использовать foreach() на order, чтобы все было чисто.

person Ignacio Vazquez-Abrams    schedule 04.02.2010
comment
Мне нравится эта идея. Мне удалось сохранить сеансы так, как вы рекомендовали, но я не совсем уверен, как написать цикл foreach и что вы подразумеваете под «порядком». Я не могу найти эту функцию на php.net - person zeckdude; 04.02.2010
comment
Я понял, что мне нужно поместить цикл foreach в этот цикл foreach. Спасибо! - person zeckdude; 04.02.2010

Почему бы не сохранить в сеансе таким образом?

$_SESSION[orders] => array(
  [0]=>array(
     'quantity'=>1,
     'language'=>'Korean'
   ),
  [1]=>array(
    'quantity'=>2,
    'language'=>'Chinese'
   ),
)

Тогда ваша итерация на странице оформления заказа будет простой

person Dal Hundal    schedule 04.02.2010

Группировать поля относительно легко. Просто прокрутите их все, снимите номер в конце и сгруппируйте их в другой массив.

$vars = array();
foreach ($_SESSION as $k => $v) {
  if (preg_match('!\d+$!', $k, $matches)) {
    $number = $matches[0];
    if (array_key_exists($number, $vars)) {
      $vars[$number][$k] = $v;
    } else {
      $vars[$number] = array($k => $v);
    }
  }
}
print_r($vars);

Чтобы отобразить их, выполните цикл $vars и сделайте то, что вам нужно. Возможно, вам придется отсортировать $vars, если вы хотите, чтобы они располагались в определенном порядке. Вам может понадобиться отсортировать подмассивы, чтобы расположить поля в определенном порядке.

person cletus    schedule 04.02.2010