0

I have an array in a PHP class and two member functions

First one receives two integers, one is the dimension and the other is the value:

private $complexArray;

function setValueToGivenDimension($dimension, $value)

What I want to do is to set the value to the given dimension of the array.

For example, If I call the function as the following:

setValueToGivenDimension(3,"key","myValue")

I want the array to be

array [
  0 => array [
    0 => array [
      "key" => "myValue"
    ]
  ]
]

And Second is function getValueOfGivenDimension($dimension, $key)

For example, If I call the function as the following:

getValueOfGivenDimension(3,"key")

It should return value of the given key which is 0 in this case of the 3rd dimension of the $complexArray:

"myValue"

*array can have any level of dimension and I want to create and index dimensions of the array dynamically.

0

3 Answers 3

4
+50

Here is a way to do it. Note the use of & to get a reference on the array:

function setValueToGivenDimension(&$array, $dimension, $key, $value)
{
    for($i=1;$i<$dimension;$i++)
    {
        if(!isset($array[0]))
            $array[0] = [];
        $array = &$array[0];
    }
    $array[$key] = $value;
}

function getValueOfGivenDimension($array, $dimension, $key)
{
    for($i=1;$i<$dimension;$i++)
    {
        if(!isset($array[0]))
            return null;
        $array = $array[0];
    }
    if(!isset($array[$key]))
        return null;
    return $array[$key];
}

$complexArray = [];
setValueToGivenDimension($complexArray, 3, 'key', 'value');
echo getValueOfGivenDimension($complexArray, 3, 'key');
Sign up to request clarification or add additional context in comments.

Comments

3

You can use recursion for both.

The following method will return the array you desire, so you can set your private variable to the output.

function setValueToGivenDimension($dimension, $value) {
     // Base case: if the dimension is 0, then we should return the value
     if ($dimension == 0) return $value;
     
     // If the dimension is greater than 0, then return the recursive function call, wrapped in a new array
     return [setValueToGivenDimension($dimension - 1, $value)];
}

The following method will take an array, dimension, and key, and output the value for the nth dimension of that array, using the key in the innermost dimension.

function getValueOfGivenDimension($array, $dimension, $key) {
     // Base case: if the function is at dimension 1, then return the value at the given key for the array
     if ($dimension == 1) return $array[$key];
     
     // If the dimension is greater than 0, then recursively call the function on the only child of the given array
     return getValueOfGivenDimension($array[0], $dimension - 1, $key);
}

2 Comments

setValueToGivenDimension every time returns a new array, but I want to update the existing array only, and what if I want to set a value with a key?
You could use my definition as a helper function. Your actual function could simply set your array to the value of my function.
2

Based on Olivers answer, here is the code within a class:

<?php

class MyClass
{
    private $complexArray;

    /**
     * @return void
     */
    public function doSomething()
    {
        $this->setValueToGivenDimension(3, 'key', 'value');
        print_r($this->complexArray);
        echo $this->getValueOfGivenDimension(3, 'key') . PHP_EOL;
    }

    /**
     * @param int $dimension
     * @param mixed $key
     * @param mixed $value
     * @return $this
     */
    private function setValueToGivenDimension($dimension, $key, $value)
    {
        if (!is_array($this->complexArray)) {
            $this->complexArray = [];
        }
        if ($dimension > 0) {
            $array = &$this->complexArray;
            for ($i = 1; $i < $dimension; $i++) {
                if (!isset($array[0])) {
                    $array[0] = [];
                }
                $array = &$array[0];
            }
            $array[$key] = $value;
        }
        return $this;
    }

    /**
     * @param int $dimension
     * @param mixed $key
     * @return mixed|null
     */
    private function getValueOfGivenDimension($dimension, $key)
    {
        if ($dimension > 0) {
            $array = $this->complexArray;
            for ($i = 1; $i < $dimension; $i++) {
                if (!isset($array[0])) {
                    return null;
                }
                $array = $array[0];
            }
            if (!isset($array[$key])) {
                return null;
            }
            return $array[$key];
        }
        return null;
    }

}

Run it:

$mc = new MyClass();
$mc->doSomething();

Output:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [key] => value
                )

        )

)
value

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.