使用变量变量名访问嵌套数组

时间:2014-04-16 15:04:53

标签: php arrays naming-conventions

在php中有variable variable names

如例子所示:

$a = 'hello';
$$a = 'world';

echo $hello; // outputs world

现在,我们还有嵌套数组:

$myvar = Array(
    'a' => Array('b' => 1, 'c' => 2),
    'd' => Array('e' => 3, 'f' => 4)
);

echo $myvar['a']['e']; // outputs e

问题:是否可以使用变量名访问此类数组?

如下所示:

$myvarname = 'myvar[a][e]';
echo $$myvarname;

如果是 - 怎么样?

编辑:

我要做的是在循环中构建一个数组。我不知道传入的数据,所以数组可以是任何级别的深度。

有许多输入行的格式如下:

 /katalog/category1/subcategory1/subcategory2

我通过输入行循环,并用" /"分割URL。

之后我尝试构建一个数组,它将代表所有网址的结构。

 category 1
 --> subcategory 1
     --> subcategory 2
     --> subcategory 3
         --> subcategory 4
 category 2
 --> subcategory 5
 category 3
 category 4

问题的主要部分是如何将变量变量用于嵌套数组。如果可能的话。我包括了实际的用例,因为有人问我如何在现实生活中使用它。不需要解决我的问题 - 我可以自己解决这个问题。

但是,变量使用变量 - 这才是真正的问题。

2 个答案:

答案 0 :(得分:1)

可以使用eval()完成

$myvarname = "myvar['a']['b']";
eval("\$result = \${$myvarname};");
var_dump($result);

输出:

int(1)

Demo


但是使用eval()通常是一个坏主意,特别是如果这涉及用户输入。该函数允许执行任意代码 - 这意味着具有恶意意图的用户可以在您的服务器上执行有害代码。这只是一个POC,在生产代码中应该

答案 1 :(得分:1)

我建议使用递归来解决这个问题。我对输出的结构并不是100%肯定,但希望这应该能指出你正确的方向:

function createArray($pieces, $array){
  if(count($pieces) > 1){
    $key = array_shift($pieces);
    $array[$key] = createArray($pieces, isset($array[$key]) ? $array[$key] : []);
  }
  else{
    $array[$pieces[0]] = [];
  }

  return $array;
}

DEMO:https://eval.in/137546