Setting dynamic session variables(arrays) with a prefix and looping with foreach

mckaymental

I'm trying to achieve the following task in php:

  1. Setting dynamic arrays in session variables.
  2. Adding a prefix named order_ to these session variables.
  3. Looping through the session variables that starts with the prefix order_.

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!

Quasimodo's clone

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

live demo

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.

edited at
0

Comments

0 comments
Login to comment

Related

TOP Ranking

  1. 1

    Failed to listen on localhost:8000 (reason: Cannot assign requested address)

  2. 2

    How to import an asset in swift using Bundle.main.path() in a react-native native module

  3. 3

    Loopback Error: connect ECONNREFUSED 127.0.0.1:3306 (MAMP)

  4. 4

    pump.io port in URL

  5. 5

    Spring Boot JPA PostgreSQL Web App - Internal Authentication Error

  6. 6

    BigQuery - concatenate ignoring NULL

  7. 7

    ngClass error (Can't bind ngClass since it isn't a known property of div) in Angular 11.0.3

  8. 8

    Do Idle Snowflake Connections Use Cloud Services Credits?

  9. 9

    maven-jaxb2-plugin cannot generate classes due to two declarations cause a collision in ObjectFactory class

  10. 10

    Compiler error CS0246 (type or namespace not found) on using Ninject in ASP.NET vNext

  11. 11

    Can't pre-populate phone number and message body in SMS link on iPhones when SMS app is not running in the background

  12. 12

    Generate random UUIDv4 with Elm

  13. 13

    Jquery different data trapped from direct mousedown event and simulation via $(this).trigger('mousedown');

  14. 14

    Is it possible to Redo commits removed by GitHub Desktop's Undo on a Mac?

  15. 15

    flutter: dropdown item programmatically unselect problem

  16. 16

    Change dd-mm-yyyy date format of dataframe date column to yyyy-mm-dd

  17. 17

    EXCEL: Find sum of values in one column with criteria from other column

  18. 18

    Pandas - check if dataframe has negative value in any column

  19. 19

    How to use merge windows unallocated space into Ubuntu using GParted?

  20. 20

    Make a B+ Tree concurrent thread safe

  21. 21

    ggplotly no applicable method for 'plotly_build' applied to an object of class "NULL" if statements

HotTag

Archive