使用前缀设置动态会话变量(数组),并使用foreach循环



我正试图在php中实现以下任务:

  1. 在会话变量中设置动态数组
  2. 向这些会话变量添加一个名为order_的前缀
  3. 循环遍历以前缀order_开头的会话变量

这是我迄今为止的代码:

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循环遍历结果的方法。

有人能给我一些关于如何使用foreach循环仅操作前缀为order_的会话变量的建议吗?

谢谢大家!

根据Joomla JSession文档,JSession类确实提供了返回ArrayIteratorgetIterator方法。

作为一种可重用的方法,您可以实现自己的FilterIterator类,只对具有特定前缀的项进行迭代,可以选择从键中剥离前缀。

在您的代码中,您可以通过获得迭代器

$sessionArrayIter = $session->getIterator();

由于我不太了解Joomla,也没有任何安装正在运行,我将伪造该部分:

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

类实现

然后我们实现了扩展PHP抽象FilterIterator类的PrefixFilterIterator类。

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,必须调整类型提示。CCD_ 7在PHP<7.1并且必须删除,同样?bool也必须更改为bool

这是一个简单的实现,专注于问题中的问题,以减少答案中的"噪音"。mbstring是PHP的非默认扩展。因此,我没有使用多字节字符串函数。但是,数组键可能包括多字节字符集。为了支持这样的键,需要一些字符串函数包装器的条件实现,如果安装了适当的函数,则使用它们。带有u修饰符的preg_*函数可以作为支持多字节unicode密钥的替代方案

最新更新