PHP 动态访问关联数组

PHP Dynamically accessing an associative array

提问人:Jeff Greenberg 提问时间:12/18/2014 最后编辑:Jeff Greenberg 更新时间:12/18/2014 访问量:1347

问:

从原始编辑,暗示只有 1 次访问

如果我有一个包含 x 个数组的数组,则每个数组的

array('country' => array('city' => array('postcode' => value)))

和另一个数组可能是

array('country', 'city', 'postcode') or array('country', 'city') 

根据我需要检索的内容,我如何使用第二个数组来标识第一个数组的索引级别,然后访问它。

php 关联数组 变量

评论

0赞 Gabriel 12/18/2014
有什么特别的原因为什么不做一个简单的循环吗?
1赞 Rizier123 12/18/2014
我几乎会称之为:!如果您扩展您的问题,请将其标记为编辑!如果编辑是一个全新的问题,请重新开始!stealth edit
0赞 Jeff Greenberg 12/18/2014
这不是一个全新的问题。它被编辑以表明它必须多次完成。
0赞 dynamic 12/18/2014
对不起,但此编辑与您原来的问题相同,正如我在评论中解释的那样,您内部的值不能超过 1 个$array['capital']['city']['postcode']
0赞 Jeff Greenberg 12/18/2014
不,你不能。但这不是重点。我只是说,如果数组包含 20 个国家/地区,我是否需要根据 20 个国家/地区中每个国家/地区的索引一次又一次地迭代,或者有没有办法将索引组合成一个变量变量并使用它来访问 20 个国家/地区中的每一个,而不是迭代。

答:

1赞 dynamic 12/18/2014 #1

通过嵌套引用,您可以读取和修改原始值: ide1 上的实时示例:
http://ideone.com/xtmrr8
$cur = &$cur[$v];

$array = array('x' => array('y' => array('z' => 20)));
$keys = array('x', 'y', 'z');

// Start nesting new keys
$cur = &$array;
foreach($keys as $v){
    $cur = &$cur[$v];
}

echo $cur;  // prints 20
$cur = 30;  // modify $array['x']['y']['z']

评论

1赞 Rizier123 12/18/2014
我认为这是最好的答案!非常好的解释和很好的评论!值得一:D
0赞 Jeff Greenberg 12/18/2014
请允许我再补充一点。如果我有 20 个$array,假设每个都是一个国家,并且给定$keys,我需要以相同的方式访问 20 个中的每一个,有没有办法在不迭代每个国家的情况下做到这一点?
0赞 dynamic 12/18/2014
我不知道这是一个不同的问题还是相关的。无论如何,如果这个答案对您有所帮助,请考虑 +1 它
0赞 Jeff Greenberg 12/18/2014
同样的问题。只是想考虑效率。如果我的键是 ('capital', 'city', 'postcode']) 并且我想要 20 个国家/地区中每个国家/地区的邮政编码,一旦我确定了密钥,我应该怎么做?可能是,没有办法将其作为变量变量(如 ${$myarray}{['x']['y']['z']} 或类似的东西。只是确保。
0赞 dynamic 12/18/2014
如果您要访问阵列中的确切项目,您怎么能拥有 20 个国家/地区?无论如何,我认为这是另一个问题,打开一个新问题$array['capital']['city']['postcode']
1赞 Glen 12/18/2014 #2

遍历索引数组,逐步向下移动初始数组,直到到达索引数组的末尾。

$array1 = array('x' => array('y' => array('z' => 20)));
$keys = array('x', 'y', 'z');
$array_data = &$array1;
foreach($keys as $key){
    $array_data = &$array_data[$key];
}
echo $array_data;

评论

0赞 dynamic 12/18/2014
这将创建该值的新副本
0赞 Glen 12/18/2014
编辑以通过引用传递
0赞 Jeff Greenberg 12/18/2014 #3

好的,我很抱歉最初没有更清楚地表达我的问题,但我让它按照我希望的方式工作,有一个变量变量,如下所示:

$keystring = '';
foreach ($keys as $key) {
  $keystring .= "['$key']";
}

然后,针对其中的每个国家/地区条目迭代主数组,并按以下方式访问所需的值:

eval('$value = $entry' . "$keystring;");