Задание динамических переменных сеанса (массивов) с префиксом и цикл с foreach - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь решить следующую задачу в php:

  1. Установка динамических массивов в переменных сеанса.
  2. Добавление префикса с именем order_ к этим переменным сеанса.
  3. Цикл по переменным сеанса, начинающимся с префикса _.

Вот код, который у меня есть:

foreach($array as $subarray) {
    foreach($subarray as $subset) {
        $nomInput = $subset['Nom'];
        $inputArray=[
            1=>[
                ['Nom'=>$input->get($nomInput, null, 'string'),
                 'LabelFr'=>$subset['LabelFr'],
                 'LabelEn'=>$subset['LabelEn']]
            ]
         ];

         $session->set('order_'.$nomInput, $inputArray);
     }
}

С помощью этого кода я могу правильно установить переменные с префиксом. Тем не менее, я не могу найти способ просмотреть результаты с помощью цикла foreach.

Может кто-нибудь дать мне несколько советов о том, как манипулировать только переменными сеанса с префиксом order_ с помощью цикла foreach?

Спасибо большое!

1 Ответ

0 голосов
/ 14 января 2019

Согласно документации Joomla JSession класс JSession предоставляет метод getIterator, возвращающий ArrayIterator.

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

В вашем коде вы получите итератор по

$sessionArrayIter = $session->getIterator();

Поскольку я не очень хорошо знаю Joomla и у меня не запущена какая-либо установка, я подделаю эту часть:

$sessionArray     = ['aa_test1' => 1, 'bb_test2' => 2, 'aa_test3' => 3, 'cc_test4' => 4];
$sessionArrayIter = new ArrayIterator($sessionArray);

Реализация класса

Затем мы реализуем класс PrefixFilterIterator, расширяющий абстрактный класс FilterIterator PHP.

class PrefixFilterIterator extends FilterIterator
{
  private
    $_prefix,
    $_prefixLength,
    $_strip_prefix
  ;

  public function __construct(Iterator $iterator, string $prefix, bool $strip_prefix = false)
  {
    parent::__construct($iterator);
    $this->set_prefix($prefix, $strip_prefix);
  }

  public function set_prefix(string $prefix, ?bool $strip_prefix = null) : void
  {
    $this->_prefix       = $prefix;
    $this->_prefixLength = strlen($prefix);
    if(null !== $strip_prefix)
      $this->_strip_prefix = $strip_prefix;
  }

  // conditionally remove prefix from key
  public function key()  /* : mixed scalar */
  {
    return $this->_strip_prefix ? substr(parent::key(), $this->_prefixLength) : parent::key();
  }

  // accept prefixed items only
  public function accept() : bool
  {
    return 0 === strpos(parent::key(), $this->_prefix);
  }
}

Использование

Чтобы перебрать фильтрованные элементы, мы создаем новый экземпляр нашего итератора.

$prefixIter = new PrefixFilterIterator($sessionArrayIter, 'aa_', true);

foreach ($prefixIter as $k => $v)
  echo "$k => $v", PHP_EOL;

выход

test1 => 1
test3 => 3

живое демо

Примечания, лимиты, Задачи:

Код выше работает на PHP> = 7.1

Для поддержки PHP 7.0, подсказки типа должны быть адаптированы. :void не поддерживается в PHP <7.1 и должен быть удален, аналогично <code>?bool необходимо изменить на bool.

Это простая реализация, фокусирующая проблему в вопросе на уменьшение «шума» в ответе. mbstring не является расширением по умолчанию для PHP. Поэтому я не использовал многобайтовые строковые функции. Однако ключи массива могут включать в себя многобайтовые наборы символов. Для поддержки таких ключей потребуется условная реализация некоторых оболочек строковых функций с использованием соответствующих функций, если они установлены. Функции preg_* с модификатором u могут быть альтернативой для поддержки многобайтовых клавиш Unicode.

...