'PHP dynamic array path access

I can easily write to and read from a sub-array in the session array.

$_SESSION['a']['b']['c']['value']=123;
$val=$_SESSION['a']['b']['c']['value'];

Instead of hard coding the "location" where the value is written, I would like it to be definable via a string or some other way. The following will obviously not work, but hopefully will better explain the intent.

$prefix="['a']['b']['c']";  //defined in config page, etc
$_SESSION.$prefix.['value']=123;
$val=$_SESSION.$prefix.['value'];

How can this be accomplished?



Solution 1:[1]

I faced the same problem a few times ago, and as I didn't find any solution, I made one by myself, if that can help you in anyway (only the interesting part) :

class ArrayAccessor {

    private $prefix;

    function setPrefix() {
        $this->prefix = array();
        for ($i = 0; $i < func_num_args(); ++$i) {
            $this->prefix[] =  func_get_arg($i);
        }
    }

    function getFromPrefix(array $array) {
        $tmp_array = $array;
        foreach ($this->prefix as $pre) {
            if (isset ($tmp_array[$pre])) {
                $tmp_array = $tmp_array[$pre];
            } else {
                return null;
            }
        } 
        return $tmp_array;
    }

}



$Access = new ArrayAccessor();
$Access->setPrefix('Hi', 'Toto');

$MyTestArray['Hi']['Toto'] = 'Works';
var_dump ($Access->getFromPrefix($MyTestArray));

$Access->setPrefix('Hi');
var_dump ($Access->getFromPrefix($MyTestArray));

$Access->setPrefix('No');
var_dump ($Access->getFromPrefix($MyTestArray));

Result :

string(5) "Works"

array(1) {
  ["Toto"]=>
  string(5) "Works"
}

NULL

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Clément Malet