简体   繁体   中英

How to add and index dimensions of arrays in php dynamically?

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.

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');

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);
}

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

does this work the way you want it to work?

<?php

class ComplexArray {

      private $complexArray = [["key1" => "value1"]];

      function setValueToGivenDimension($dimension, $key, $value) {
            $current = &$this->complexArray;

            for($i = 1; $i < $dimension; $i++) {
                  $current = &$current[0];
            }
            $current = &$current[$key];
            $current = $value;

            return $this->complexArray;
      }

      function getValueOfGivenDimension($dimension, $key) {
            $current = $this->complexArray;

            for($i = 1; $i < $dimension; $i++) {
                  $current = $current[0];
            }
            return $current[$key];
      }
}


$whaat = new ComplexArray();
print_r($whaat->setValueToGivenDimension(3, "key2", "value2"));
echo $whaat->getValueOfGivenDimension(3, "key2");

?>

edit. output is:

Array
(
    [0] => Array
        (
            [key1] => value1
            [0] => Array
                (
                    [key2] => value2
                )

        )

)
value2

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM