PHP数组作为变量名
如何为php数组VARABLE发送索引名称 数组是PHP数组作为变量名,php,arrays,variables,Php,Arrays,Variables,如何为php数组VARABLE发送索引名称 数组是 $array = array('Somthing'=>array('More'=>array('id'=> 34))); 现在我想显示这个东西,但是用一个变量名,我不知道如何解释,所以我写下我想要的 $index_name = '[Something][More][id]'; $array{$index_name}; 有可能吗?不是一下子就能做到的。以下是您的做法: $array['Something']['More']
$array = array('Somthing'=>array('More'=>array('id'=> 34)));
现在我想显示这个东西,但是用一个变量名,我不知道如何解释,所以我写下我想要的
$index_name = '[Something][More][id]';
$array{$index_name};
有可能吗?不是一下子就能做到的。以下是您的做法:
$array['Something']['More']['id']
如果您特别希望使用单个字符串访问多维数组,则可以构建一个函数:
function array_multi(Array $arr, $path) {
$parts = explode(".", $path);
$curr =& $arr;
for ($i = 0, $l = count($parts); $i < $l; ++$i) {
if (!isset($curr[$parts[$i]])) {
// path doesn't exist
return null;
} else if (($i < $l - 1) && !is_array($curr[$parts[$i]]) {
// path doesn't exist
return null;
}
$curr =& $curr[$parts[$i]];
}
return $curr;
}
// usage:
echo array_multi($array, "Something.More.id"); // 34
echo array_multi($array, "Something.More"); // array("id" => 34)
函数数组\u multi(数组$arr,$path){
$parts=分解(“.”,$path);
$curr=&$arr;
对于($i=0,$l=count($parts);$i<$l;+$i){
如果(!isset($curr[$parts[$i]])){
//路径不存在
返回null;
}else if(($i<$l-1)和&!is_数组($curr[$parts[$i]])){
//路径不存在
返回null;
}
$curr=&$curr[$parts[$i]];
}
返回$curr;
}
//用法:
echo array_multi($array,“Something.More.id”);//34
echo array_multi($array,“Something.More”);//数组(“id”=>34)
您可以通过以下方式完成此操作:
更新:
似乎有些用户对使用eval()的想法感到不舒服。我认为在决定是否在您自己的代码中使用eval()之前,先使用eval()是有意义的。好的,我知道这就是人们被枪杀的原因。但是拜托,
eval()
并不总是错误的答案
$array = array('Something'=>array('More'=>array('id'=> 34)));
$index_name = '[Something][More][id]';
eval('$val = $array'.$index_name.';'); // Wrap in a function or something
支持方括号语法的递归版本:
$array = array('Something'=>array('More'=>array('id'=> 34)));
$string = '[Something][More][id]';
echo scan_array($string, $array);
function scan_array($string, $array) {
list($key, $rest) = preg_split('/[[\]]/', $string, 2, PREG_SPLIT_NO_EMPTY);
if ( $key && $rest ) {
return scan_array($rest, $array[$key]);
} elseif ( $key ) {
return $array[$key];
} else {
return FALSE;
}
}
如果你把自己逼到需要做这样的事情的地步,你很有可能以一种糟糕的方式做了其他事情。这样做是有正当理由的,但不是经常这样做
function key_path($arr, $keys) {
return $keys ? key_path($arr[array_shift($keys)], $keys) : $arr;
}
$arr['Something']['More']['id'] = 34;
$keys = array('Something', 'More', 'id');
var_dump( key_path($arr, $keys));
正则表达式应该可以做到这一点。但更改不会非常有效或灵活。顺便说一句,您的原始代码中有一个输入错误。您在$array中定义了一个名为“Somthing”的键,但后来尝试引用它,称之为“Something”。不要错过这个问题的有效答案,使用eval()可以非常简单地完成此操作。讨论最佳实践非常重要,但如果我们仅仅因为认为我们比OP更了解情况而忽视问题的有效和简单的解决方案,那就太愚蠢了。干杯。如果你打算花时间否决我的答案,发表评论肯定会很好。我认为这与eval()有关用法。但我不是投反对票的人。具体来说,eval()呢用法?它完成了OP想要做的事情。这是一个完美的例子,说明了为什么它是错误的。你的字符串中有语法错误。谁他妈的想调试正在动态生成的代码?代码运行没有问题,所以我不知道所谓的语法错误在哪里。但是如果你提到索引键上缺少的引号我同意这很难看,但并没有错。php将所有未定义的常量计算为它们的字符串值,我只是从op中剪切了“n”粘贴。
function key_path($arr, $keys) {
return $keys ? key_path($arr[array_shift($keys)], $keys) : $arr;
}
$arr['Something']['More']['id'] = 34;
$keys = array('Something', 'More', 'id');
var_dump( key_path($arr, $keys));