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

时间:2019-01-13 23:36:01

标签: php multidimensional-array joomla3.0

我正在尝试在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_的会话变量的提示吗?

谢谢你!

1 个答案:

答案 0 :(得分:0)

根据Joomla JSession documentationJSession类确实提供了一种返回getIterator的{​​{1}}方法。

作为可重用的方法,您可以实现自己的ArrayIterator类,仅对具有特定前缀的项目进行迭代,然后可选地从键中剥离前缀。

在您的代码中,迭代器为

FilterIterator

由于我不太了解Joomla,并且没有任何安装在运行,因此我将欺骗该部分:

$sessionArrayIter = $session->getIterator();

类实现

然后,我们实现$sessionArray = ['aa_test1' => 1, 'bb_test2' => 2, 'aa_test3' => 3, 'cc_test4' => 4]; $sessionArrayIter = new ArrayIterator($sessionArray); 类,扩展PHP的抽象PrefixFilterIterator类。

FilterIterator

用法

要遍历过滤后的项目,我们创建了迭代器的新实例。

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;

live demo

备注,限制和待办事项:

上面的代码在 PHP> = 7.1

上运行

要支持PHP 7.0,必须修改类型提示。 {<1}}在PHP <7.1中不受支持,必须将其删除,同样必须将test1 => 1 test3 => 3 更改为:void

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