2010-01-08 79 views
1

我需要一个具有可变数量参数的函数来访问多维数组的元素。我这样做($ this - > _ config是数组)...访问多维数组元素,使用函数

function item() 
{ 
    if(func_num_args() != 0){ 
     $config = $this->_config; 
     $args = func_get_args(); 
     foreach($args as $item){ 
      $config = $config[$item]; 
     } 
     unset($args); 
     return $config; 
    } 
    else throw new Exception('An item index is required.'); 
} 

有没有办法做得更好?谢谢大家!

回答

1

在你的问题,你说你有一个多维数组,所以我把它是这样的:

调用item('foo', 'bar', 'baz')将通过最后一个阵列上运行所有的方式,并返回3.如果这是你可以写$config['foo']['bar']['baz']或将你的配置放在ArrayObject中,并使用数组访问表示法或$config->foo->bar->baz(尽管所有嵌套数组也必须是ArrayObjects)。

如果你想保留这个函数,你应该在抓取它之前在索引上添加一些检查,因为PHP会提出一个关于未定义索引的通知。另外,为什么不使用InvalidArgumentException而不是Exception。适合这种情况。

编辑:删除了答案的某些部分,因为它是评论
TBH后更喜欢大声思维

编辑,我觉得这是一个比较尴尬的方式来重塑通过类似的方法数组访问这个。在我看来,您应该在构建过程中将整个配置或子集传递给对象,并让它们通过常规数组访问器来获取所需的任何内容。这将从您的configManager中获得decouple您的对象,并允许稍后修改。

+0

该方法位于一个类中,该类管理存储在数组中的各种配置项($ this - > _ config)。这个类加载了更多的配置文件,名为$ config,并将所有文件中的oll项添加到$ this - > _ config中。现在,可以在配置文件“config_file.php”中创建一个具有以下元素的数组$ config: $ config ['config_file'] ['element1'] ='aaa'; $ config ['config_file'] ['element2'] ='aaa'; $ config ['config_file'] ['database'] ['user'] ='user'; 因此,调用另一个类... $ configmanager-> item('config_file','database','user'),它必须返回'user'。 – flux 2010-01-08 09:52:45

+0

在实践中,我不知道有多少个参数被传递......谢谢你的建议,第二个可能对我有用 – flux 2010-01-08 09:58:02

+0

好吧,你是对的......我想我会做这样,无论数组$ this-> config中有什么,它都会返回内容,如果它是另一个数组。非常感谢您的帮助 – flux 2010-01-09 15:17:54