Take the 2-minute tour ×

I have a string like this:

$string = 'one/two/three/four';

which I turn it into a array:

$keys = explode('/', $string);

This array can have any number of elements, like 1, 2, 5 etc.

How can I assign a certain value to a multidimensional array, but use the $keys I created above to identify the position where to insert?


$arr['one']['two']['three']['four'] = 'value';

Sorry if the question is confusing, but I don't know how to explain it better

share|improve this question

4 Answers 4

up vote 8 down vote accepted

This is kind of non-trivial because you want to nest, but it should go something like:

function insert_using_keys($arr, $keys, $value){
    // we're modifying a copy of $arr, but here
    // we obtain a reference to it. we move the
    // reference in order to set the values.
    $a = &$arr;

    while( count($keys) > 0 ){
        // get next first key
        $k = array_shift($keys);

        // if $a isn't an array already, make it one
            $a = array();

        // move the reference deeper
        $a = &$a[$k];
    $a = $value;

    // return a copy of $arr with the value set
    return $arr;
share|improve this answer
$arr = array(); // some big array with lots of dimensions
$ref = &$arr;

while ($key = array_shift($keys)) {
    $ref = &$ref[$key];

$ref = 'value';

What this is doing:

  • Using a variable, $ref, to keep track of a reference to the current dimension of $arr.
  • Looping through $keys one at a time, referencing the $key element of the current reference.
  • Setting the value to the final reference.
share|improve this answer
I get a "connection closed by server" when I try this :) –  Alex Sep 22 '11 at 1:14
ok now it works :D –  Alex Sep 22 '11 at 1:15
What if $keys contains 0 or NULL? –  Mark Elliot Sep 22 '11 at 1:16
He asked how to solve the problem, not write error-checking for it :) –  drrcknlsn Sep 22 '11 at 1:17
And your solution "fails miserably" when $arr is not an array, along with a handful of other cases. Bullet-proof error-checking is not a prerequisite for a correct answer. –  drrcknlsn Sep 22 '11 at 1:34

You'll need to first make sure the key's exist, then assign the value. Something like this should work (untested):

function addValueByNestedKey(&$array, $keys, $value) {
    $branch = &$array;
    $key = array_shift($keys);
    // add keys, maintaining reference to latest branch:
    while(count($keys)) {
        $key = array_pop($keys);
        if(!array_key_exists($key, $branch) {
            $branch[$key] = array();
        $branch = &$branch[$key];
    $branch[$key] = $value;

// usage:
$arr = array();
$keys = explode('/', 'one/two/three/four');

addValueByNestedKey($arr, $keys, 'value');
share|improve this answer

it's corny but:

function setValueByArrayKeys($array_keys, &$multi, $value) {
     $m = &$multi
     foreach ($array_keys as $k){
         $m = &$m[$k];
     $m = $value;
share|improve this answer
This won't work. $multi = $multi[$k] creates a copy, it's not a reference, so you're not actually modifying anything when you do $multi = $value, except the final array. –  Mark Elliot Sep 22 '11 at 1:11
just edited it. –  MattoTodd Sep 22 '11 at 1:14
it still won't work, you're creating copies, not references. –  Mark Elliot Sep 22 '11 at 1:15
In general, if you're not familiar with the target language, you ought to run your code. –  Mark Elliot Sep 22 '11 at 1:29
bit.ly/qwI53G –  MattoTodd Sep 22 '11 at 2:16

Your Answer


