I'm trying to achieve the following task in php:
Here's the code I have so far:
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);
}
}
With this code, I'm able to set the variables correctly with the prefix. However, I can't find a way to loop through the results with a foreach loop.
Can somebody give me some pointers on how to manipulate only the session variables that have the prefix order_ with a foreach loop?
Thanks a bunch!
According to the Joomla JSession documentation the JSession
class does provide a getIterator
method returning an ArrayIterator
.
As a reusable approach, you could implement your own FilterIterator
class, only iterating over items having a specific prefix and optionally stripping the prefix from keys.
In your code you get the iterator by
$sessionArrayIter = $session->getIterator();
Since I do not well know Joomla and do not have any installation running, I will spoof that part:
$sessionArray = ['aa_test1' => 1, 'bb_test2' => 2, 'aa_test3' => 3, 'cc_test4' => 4];
$sessionArrayIter = new ArrayIterator($sessionArray);
Class Implementation
Then we implement the PrefixFilterIterator
class extending PHP's abstract FilterIterator
class.
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);
}
}
Usage
To iterate over the filtered items, we create a new instance of our iterator.
$prefixIter = new PrefixFilterIterator($sessionArrayIter, 'aa_', true);
foreach ($prefixIter as $k => $v)
echo "$k => $v", PHP_EOL;
Output
test1 => 1
test3 => 3
Remarks, Limits, ToDo:
The code above runs on PHP >= 7.1
To support PHP 7.0, type hints must be adapted. :void
is not supported in PHP<7.1 and must be removed, likewise ?bool
must be changed into bool
.
This is a simple implementation focussing the problem in the question to reduce the 'noise' in the answer. mbstring
is a non-default extension to PHP. Therefore I did not use multibyte string functions. However, array keys may include multibyte charactersets. To support such keys, a conditional implementation of some string function wrappers would be required, using appropriate functions if they are installed. The preg_*
functions with the u
modifier could be an alternative to support multibyte unicode keys.
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments