Согласно документации 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.