Php 使用变量获取数组索引的值
我有一个递归数组,它的深度是可变的,我希望能够获取一个带分隔符的字符串,并将该字符串转换为该数组中的索引 比如说Php 使用变量获取数组索引的值,php,arrays,recursion,Php,Arrays,Recursion,我有一个递归数组,它的深度是可变的,我希望能够获取一个带分隔符的字符串,并将该字符串转换为该数组中的索引 比如说 $path = 'level1.level2.level3'; 将转换为从下面的数组中获取值“my data” $data['level1']['level2']['level3'] = 'my data'; 我认为最快的方法是使用变量,但是当我尝试下面的代码时 $index = "data['level1']['level2']['level3']"; echo $$inde
$path = 'level1.level2.level3';
将转换为从下面的数组中获取值“my data”
$data['level1']['level2']['level3'] = 'my data';
我认为最快的方法是使用变量,但是当我尝试下面的代码时
$index = "data['level1']['level2']['level3']";
echo $$index;
我得到如下错误
PHP Notice: Undefined variable: data['level1']['level2']['level3']
我能想到的所有其他方法都是非常低效的,请有人解释一下,在PHP中使用数组变量可能吗?还有其他有效的解决办法吗
非常感谢。试试看
$index = "data";
echo $$index['level1']['level2']['level3'];
相反,因为
$index
应该是唯一的变量名您必须循环数组,所以据我所知,您无法使用变量来实现这一点。但这似乎是可行的:
<?php
function retrieve( $array, $path ) {
$current = $array;
foreach( explode( '.', $path ) as $segment ) {
if( false === array_key_exists( $segment, $current ) ) {
return false;
}
$current = $current[$segment];
}
return $current;
}
$path = 'level1.level2.level3';
// will be converted to get the value 'my data' from the array below
$data['level1']['level2']['level3'] = 'my data';
var_dump( retrieve( $data, $path ) );
这是一个棘手的问题,下面是我能想到的最有效的方法:
function get_value_from_array ($array, $path, $pathSep = '.') {
foreach (explode($pathSep, $path) as $pathPart) {
if (isset($array[$pathPart])) {
$array = $array[$pathPart];
} else {
return FALSE;
}
}
return $array;
}
返回值,失败时返回FALSE。类似以下内容:
eval('$data[\''.implode("']['",explode('.',$path))."'] = 'my data';");
…但永远不要告诉任何人我告诉过你要这样做。你可以使用eval
这样的函数:
$data['level1']['level2']['level3'] = 'my data';
eval("\$index = \$data['level1']['level2']['level3'];");
echo $index;
嗯,投票被否决的原因是什么?有人在生气吗?想解释一下以便我能改进我的答案吗?这对他没有帮助,因为他没有级别1/2/3的细分。如果他这样做了,那么就没有必要使用$$index
notation@AleksG当前位置他唯一需要做的就是更改“级别1”。。。对于变量,它不能与变量名一起工作实际上,他有一个包含level1.level2.level3
-他可以将其转换为包含数据['level1']['level2']['level3']
的字符串。我之所以要使用变量变量,是因为数组的深度是可变的,也就是说,level1.level2.level3也可以是level1.level2.level3.level4……你称之为“非效率”吗?原因是什么?我称之为“低效”,因为如果索引很深,并且数组结构很大,它会在递归数组中多次复制数组。您可以使用isset($current[$segment])
而不是array\u key\u exists()
。这会快一点。@Scottsaunder您可以理解,但是如果值为“null”,这将不起作用。这就是为什么我选择了array_key_exists。@Scott我会注意到这一点吗?@scottsa不必担心,我不会采取其他方式。只是1)不同,因为空值是“未设置”的,2)事实上,这还为时过早。但无论如何,感谢大家的提醒:)这个答案和Berry提出的解决方案与我已经实现的类似,我正在尝试优化它,因为如果所提供的值在结构中非常深入(并且数组结构可能非常巨大),这意味着将有大量的阵列复制周期costly@Haddad可能还不足以让你担心。除非你真的这样做了几十万次,否则它不会有太大的区别,以至于引起注意。@Haddad那么,如果我可以问一下,你为什么要做foo.bar.path之类的事情呢?为什么不仅仅是$array['foo']['bar']['path']?你真的需要用这个吗。作为分隔符?@Berry我使用基于分隔符的路径为这些值提供一个“名称空间”路径,这些值作为Web服务提供,因此该路径将作为HTTP参数接收。