【问题标题】:How to reffer dynamically to a php ARRAY variable(s)?如何动态引用 php ARRAY 变量?
【发布时间】:2011-12-12 15:20:02
【问题描述】:

每个人都知道您可以使用以下命令访问 PHP 中的变量:${'varName'}。但是当您需要获取/设置一个变量时,女巫是数组的一部分,为什么它不起作用?假设我们有这段代码:

<?php
   $myArray = array(...);
   $myVarName = "myArray['my1']['my11']['my111']";
   ${$myVarName} = "new value";
?>

它不应该工作吗? 我一次又一次地测试它 - 它不工作.. 有没有办法做到这一点?

【问题讨论】:

  • 那些被称为变量变量。你永远不应该使用它们。您要解决的根本问题是什么?
  • 我为不使用任何框架的人工作项目,我需要构建一些功能来帮助自己。因此,我尝试构建一个特定的函数,该函数应该获取类别列表并为无限级别创建一个树(父级-> 子级)。我到了某个点(在女巫的递归函数中,我必须在有序数组中设置一些数组变量)。
  • .. 我必须建立我需要设置的数组 var 的路径。
  • 为什么你应该“从不使用”变量变量?它们通常非常有用,如果使用得当,它们没有任何问题。

标签: php arrays variables


【解决方案1】:

它不应该工作吗?

没有。

每个人都知道您可以使用以下命令访问 PHP 中的变量:${'varName'}。

是的。然而每个人都知道那很糟糕。

如何动态引用 php 数组变量?

拥有('my1','my11','my111') 的数组,您可以仅使用循环来引用任何特定的数组成员。

【讨论】:

  • 我同意动态变量是蹩脚的。但是,当您通过“仅使用循环”来解决问题时,我相信您是错误的。根据键的路径修改多维关联数组并不那么明显。它至少不需要参考吗?
  • @Mytskine 首先我会问你是否真的需要那个
  • @Col。弹片您对根据简单查询结果创建树(父->子)数组有什么建议吗?这就是我想要做的。雇用我从事我工作的人没有使用任何框架 - 因此我没有这种工具提供的特权。
  • @Col.Shrapnel 也许他不需要这个,但这就是他要求的,对我来说这似乎是一个合理的问题。如果您对他的需求有疑问,请告诉他替代方案。我已经发布了自己的答案,我相信它更具建设性。
【解决方案2】:

我建议你不要使用像${$var} 这样的动态变量。 您想要的是根据键的路径修改多维关联数组。

<?php
$myArray = array(...); // multi-dimensional array
$myVarPath = array('my1', 'my11', 'my111');
setValueFromPath($myArray, $myVarPath);

function getValueFromPath($arr, $path)
{
    // todo: add checks on $path
    $dest = $arr;
    $finalKey = array_pop($path);
    foreach ($path as $key) {
        $dest = $dest[$key];
    }
    return $dest[$finalKey];
}

function setValueFromPath(&$arr, $path, $value)
{
    // we need references as we will modify the first parameter
    $dest = &$arr;
    $finalKey = array_pop($path);
    foreach ($path as $key) {
        $dest = &$dest[$key];
    }
    $dest[$finalKey] = $value;
}

这是一个简单的程序示例。你可能想把你的分层数组和这个函数放在一个类中。

【讨论】:

  • 非常感谢,Mytskine!这就是我需要的! [ +10 ](有 1 个声望,我不能投票..)
  • @Macovei.Radu 很高兴我能帮上忙。这是一个简单但有趣的问题(我很少在 PHP 中使用引用)。您仍然可以通过单击答案左侧的复选标记来接受答案(有关更多信息,请参阅 SO 常见问题解答)。
【解决方案3】:

可以做这样的事情,但这将是一个非常糟糕的主意。对不起上校;)

<?php
$mA = array();
$mVN = "mA['m1']['m2']['m3']";
eval('$'. $mVN . ' = "new value";');
print_r($mA);
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-01
    • 2011-04-19
    • 2012-11-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多