PHP:将标准数组转换为关联数组键?

时间:2016-05-14 23:12:35

标签: php arrays

我正在研究一个以数组作为参数的函数,然后使用输入数组作为键调用不同关联数组的值。例如,

array('level_1', 'level_2', 'level_3')

应该成为

$variable_defined_within_function['level_1']['level_2']['level_3']

我有办法做到这一点,我觉得它会起作用,但它感觉很乱,很奇怪,我真的不想使用eval(),除非我绝对必须。

function fetch($keys) {
  if (!is_array($keys)) { $variable = array($keys); }
  foreach ($keys as $key) {
    $assoc_string .= '[' . str_replace('\'' . '\\\'' . $key) . ']';
  }
  $reqstring = 'if (isset($this->vars' . $assoc_string . ')) { return $this->vars' . $assoc_string . '; } else { return false; }';
  eval($reqstring);
}

那似乎不对,是吗?我怎样才能将键列表转换为关联数组?

3 个答案:

答案 0 :(得分:2)

这样的事情怎么样:

document.getElementById('myDiv').style.background = 'url(my-bknd.jpg)';

答案 1 :(得分:1)

请将此功能视为一个起点:

function fetch(array $keys, array $array) {
        $pointer = &$array;

        foreach ($keys as $key) {
            if (!isset($pointer[$key])) 
                break;

            $pointer = &$pointer[$key];
        }

        return $pointer;

    }

它将使用提供的$array循环遍历$keys并返回最后一个现有密钥的值。您可以将它用作基础,并为不存在的键或

添加逻辑

答案 2 :(得分:0)

这是解决方案,非常简单,但有时仍然非常混乱。

$arr = array('level_1', 'level_2', 'level_3'); 

function fetch(array $array){
    $numberOfDimensions = count($array);

    // the value of array['level_1']['level_2']['level_3']
    $value = "something";
    for($i = $numberOfDimensions-1; $i >= 0; $i--){
        $value = array($array[$i] => $value);
    }
    return $value;
}
  

的print_r(取($ ARR));

输出:

Array ( [level_1] => Array ( [level_2] => Array ( [level_3] => something ))) 

正如您所看到的,解决方案非常简单,但要了解发生了什么,您必须了解数组的工作原理。

每个数组在讨论关联数组时都有索引或哈希,并且对于每个键,只有一个值。该值可以是任何类型,因此如果我们将数组添加为另一个数组元素的值,则可以获得二维数组。如果将二维数组作为另一个数组元素的值添加,则会得到三维数组。通过重复该过程,您将获得N维数组。

算法的工作方式是从最深的键(键数组中的最后一个元素)开始,并为$ value变量赋予一个新的关联数组,这是准备设置为上面维度的数组值的值,直到循环结束。

让我们看看在更改之前和之后for循环中对变量$ value所做的更改。

变量$ value的初始值是""。 "东西"是数组level_3的值,依此类推......

所以,运行

  

的print_r(阵列[' LEVEL_1'] [' LEVEL_2'] [' level_3']);

将产生

  

东西

这是for循环中$ value变量的完整状态视图:

键:level_3

something
Array ( [level_3] => something )

键:level_2

Array ( [level_3] => something )
Array ( [level_2] => Array ( [level_3] => something ) )

键:level_1

Array ( [level_2] => Array ( [level_3] => something ) )
Array ( [level_1] => Array ( [level_2] => Array ( [level_3] => something ) ) )