如何为php数组发送索引名称vairable。作为变量名称的PHP数组
数组是
$array = array('Somthing'=>array('More'=>array('id'=> 34)));
,现在我想显示这个事情,但有一个变量名,我不知道该怎么解释,所以我写我想有什么。
$index_name = '[Something][More][id]';
$array{$index_name};
这有可能吗?
如何为php数组发送索引名称vairable。作为变量名称的PHP数组
数组是
$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)
+1我真的很喜欢这个答案:) – 2010-01-31 14:26:24
您可以用eval()做到这一点:
<?php
$array = array('Somthing'=>array('More'=>array('id'=> 34)));
$index_name = "['Somthing']['More']['id']";
$stmt='echo $array'.$index_name.';';
eval($stmt);
?>
UPDATE:
似乎有些SO用户对使用eval()的想法感到不舒服。在决定是否在你自己的代码中使用它之前,我认为它对于read this thread which discusses the pros and cons是有意义的。
如果你打算花时间降低我的答案,评论肯定会很好。 – 2010-01-31 14:37:22
我会假设它必须与eval()的用法有关。虽然我不是那个倒下的人。 – 2010-01-31 14:39:59
具体来说,eval()的用法呢?它完成了OP想要做的事情。 – 2010-01-31 14:41:02
好吧,我知道这是人们被枪杀的方式。但来吧,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
这是一个完美的例子,它为什么错了。你的**字符串**有语法错误。他们想要调试正在生成的代码吗? – nickf 2010-01-31 15:13:11
该代码运行没有问题,所以我不知道所谓的语法错误在哪里。如果你指的是索引键上的缺失引号,我同意它很丑陋,但这没有错。 php会将所有未定义的常量评估为它们的字符串值,并且我简单地从操作中删除'n'pasted。 – 2010-01-31 15:18:43
递归版本,支持用方括号你的语法:
$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));
这应该可以用正则表达式。但它不会变得非常有效或灵活。 – Tammo 2010-01-31 14:26:51
顺便说一句,你有你的原代码中的拼写错误。您在$ array中定义一个名为'Somthing'的键,但稍后您会尝试引用它,将其称为'Something'。 – 2010-01-31 14:32:57
不要错过这个问题的有效答案,这使得使用eval()非常简单。讨论SO的最佳实践很重要,但是当我们忽略了有效和简单的问题解决方案时,很愚蠢,因为我们认为我们比OP更了解情况。干杯。 – 2012-09-27 20:10:14