2016-05-14 122 views
2

我正在处理一个函数,该函数将一个数组作为参数,然后使用输入数组作为关键字调用不同关联数组的值。因此,例如,PHP:将标准数组转换为关联数组键?

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

这看起来不对,是吗?我怎么能将一个键列表转换为关联数组?

回答

2

怎么是这样的:

function fetch($keys) { 
    if (!is_array($keys)) 
     $keys = array($keys); 

    $arr = $this->vars; 

    foreach($keys as $key) 
    { 
     if (!isset($arr[$key])) 
      return FALSE; 

     $arr = $arr[$key]; 
    } 

    return $arr; 
} 
+0

我再次忽略foreach'的'电源。除了你的一些格式问题,这个工作!谢谢 – Jonesy

1

请考虑此功能为出发点:

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

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

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

     return $pointer; 

    } 

它会与提供$keys并返回最后一个现有键的值通过$array环。你可以使用它作为基础,并添加你的逻辑键不存在或什么

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

正如你所看到的,解决的方法很简单,但是要明白是怎么回事,你必须了解数组是如何工作的。

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

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

让我们看看更改前后for循环变量$ value所做的更改。

变量$ value的初始值是“something”。 “something”是数组level_3的值,依此类推...

所以,运行

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

会产生

东西

这里是$价值变量里面全状态视图循环:

重点: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)))