【问题标题】:How to use a variable to address complex associative arrays in PHP如何在 PHP 中使用变量来处理复杂的关联数组
【发布时间】:2012-06-10 21:49:56
【问题描述】:

假设我有以下多维数组:

$fruits['apple']['name'] = 'macintosh';

有没有办法在单个变量中引用整个键路径?

我想以某种方式执行以下操作:

$path = "['apple']['name']";
echo $fruits[$path];

//output would be "macintosh"

【问题讨论】:

  • &references 我想到了..
  • @vizvi 你能扩展一下吗?谢谢。
  • 你可以调用:$fruits2 = &fruits['apple'];回声 $fruits2['name'];会给“macintosh”
  • 您可能会感兴趣:stackoverflow.com/questions/8376602/… 如果您希望 $fruits['apple/name'] 有效
  • 你总是可以使用类而不是数组。

标签: php multidimensional-array


【解决方案1】:

有没有办法在单个变量中引用整个键路径?

1) 以这样的方式:$fruits[$variable],答案是不,没有

当然,有几种方法可以将单个 $variable 拆分为两个或多个,然后分别使用它的各个部分 ($fruits[$part1][$part2])

这是一个通用的解决方案:

function get_path($array, $path)
{
    $value = $array;
    $parts = explode("']['", trim($path, "[']"));
    foreach($parts as $key)
    {
        $value = $value[$key];
    }
    return $value;
}

$fruits['apple']['name'] = 'macintosh';
$path = "['apple']['name']";
echo get_path($fruits, $path);

// output = 'macintosh'

2) 如前所述,您可以使用“eval”,不推荐:

$fruits['apple']['name'] = 'macintosh';
$path = "['apple']['name']";
eval('echo $fruits' . $path . ';');

// output = 'macintosh'

3) 最后,如果您想使用引用变量访问数组的元素,那么只需:

$fruits['apple']['name'] = 'macintosh';
$path &= $fruits['apple']['name'];
echo $path;  // output = 'macintosh'

$path = 'MSX';
echo $fruits['apple']['name'];  // output = 'MSX'

【讨论】:

    【解决方案2】:

    显然有一种可怕的、永远不会被使用的方法:eval()

    但如果你真的想做这样的事情,我更喜欢这样的方法:

    function &array_value_by_address (&$array, $address, $addressSeparator = '/') {
      $parts = explode($addressSeparator, $address);
      $thisLevel = array_shift($parts);
      if (isset($array[$thisLevel])) {
        if ($parts) {
          $ref = &array_value_by_address($array[$thisLevel], implode($addressSeparator, $parts));
          return $ref;
        } else {
          return $array[$thisLevel];
        }
      }
    }
    

    由于函数声明中的引用,还可以在变量中捕获返回值并使用它来修改源数组。这是可选的 - 如果您在调用时省略 & 前缀,则捕获的值将只是一个 copu 而不是引用。

    需要注意的是 - 如果数组中的“地址”不存在,该函数将返回 NULL,但无法区分这种情况和数组中存储的 NULL 值。

    See it working

    【讨论】:

      【解决方案3】:

      J Brun 的 #3 答案是您最好的选择,但是,他的答案不正确,因为他演示了按位与运算符 (&=) 而不是引用赋值。这是更正后的代码:

      $fruits['apple'] = array( 'name' => 'macintosh' );
      
      $path = &$fruits['apple']['name'];
      
      echo $path; // outputs 'macintosh';
      

      【讨论】:

        【解决方案4】:

        参考可能是你需要的:

        $path = &$fruits['apple']['name'];
        

        现在每次访问$path 时,都会使用(或更改等)$fruits['apple']['name'] 的值。

        【讨论】:

        • 谢谢。我认为这是迄今为止我的案例中最有希望的答案。
        【解决方案5】:

        您想要做的事情不是直接可能的 - 如果变量被链接起来,那将是模棱两可的。

        您将需要编写一个访问器函数,例如

        define('SEPARATOR','|');
        
        function getElement($array,$path) {
          $path=explode(SEPARATOR,$path);
          $out=&$array;
          foreach ($path as $step) {
            if (!isset($out[$step])) return null;
            $out=$out[$step];
          }
          return $out;
        }
        
        $path="apple|name";
        echo getElement($fruits,$path);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          • 2014-10-01
          • 1970-01-01
          • 2020-06-22
          相关资源
          最近更新 更多