2010-01-31 127 views
2

如何为php数组发送索引名称vairable。作为变量名称的PHP数组

数组是

$array = array('Somthing'=>array('More'=>array('id'=> 34))); 

,现在我想显示这个事情,但有一个变量名,我不知道该怎么解释,所以我写我想有什么。

$index_name = '[Something][More][id]'; 

$array{$index_name}; 

这有可能吗?

+0

这应该可以用正则表达式。但它不会变得非常有效或灵活。 – Tammo 2010-01-31 14:26:51

+0

顺便说一句,你有你的原代码中的拼写错误。您在$ array中定义一个名为'Somthing'的键,但稍后您会尝试引用它,将其称为'Something'。 – 2010-01-31 14:32:57

+0

不要错过这个问题的有效答案,这使得使用eval()非常简单。讨论SO的最佳实践很重要,但是当我们忽略了有效和简单的问题解决方案时,很愚蠢,因为我们认为我们比OP更了解情况。干杯。 – 2012-09-27 20:10:14

回答

15

不是这样的。这里是你会怎么做:

$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) 
+0

+1我真的很喜欢这个答案:) – 2010-01-31 14:26:24

1

您可以用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是有意义的。

+2

如果你打算花时间降低我的答案,评论肯定会很好。 – 2010-01-31 14:37:22

+1

我会假设它必须与eval()的用法有关。虽然我不是那个倒下的人。 – 2010-01-31 14:39:59

+2

具体来说,eval()的用法呢?它完成了OP想要做的事情。 – 2010-01-31 14:41:02

1

好吧,我知道这是人们被枪杀的方式。但来吧,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 
+0

这是一个完美的例子,它为什么错了。你的**字符串**有语法错误。他们想要调试正在生成的代码吗? – nickf 2010-01-31 15:13:11

+0

该代码运行没有问题,所以我不知道所谓的语法错误在哪里。如果你指的是索引键上的缺失引号,我同意它很丑陋,但这没有错。 php会将所有未定义的常量评估为它们的字符串值,并且我简单地从操作中删除'n'pasted。 – 2010-01-31 15:18:43

2

递归版本,支持用方括号你的语法:

$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; 
    } 
} 
1

如果你逼到自己陷入需要做这样的事情,有你做别的事情的一个非常好的机会糟糕的方式。有这样的理由是有道理的,但并不经常。

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));