Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用变量获取数组索引的值_Php_Arrays_Recursion - Fatal编程技术网

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参数接收。