我正在尝试创建一个函数(除非已存在?),它应该接受“无限制”的参数(使用func_get_args()
)来查找数组键的值。无论阵列内部有多深,都可以找到它。
说我是否会使用$registry->getSetting( 'template', 'default' );
我应该获得$this->properties['settings']['template']['default']
的价值,或者我是否会$registry->getSetting( 'users', 1, 'name', 'first' );
我希望它会返回$this->properties['users'][1]['name']['first']
的值(只是第二个带有几个额外参数的例子)。
现在,要做这样的事情,我可以使用func_num_args()
计算传递的参数数量,然后使用不同的情况进行切换。虽然,这会将其限制为一定数量的密钥。
所以我问你是否有办法这样做,允许“无限”数量而不是固定数量的参数来访问数组的更深层键。
<?PHP
class Registry
{
// Values are actually fetched from a config file, but for easier understanding
private $properties = array(
'settings' => array(
'template' => array(
'default' => 'default',
'caching' => TRUE
)
)
);
public function getSetting( )
{
// do something like
// return $this->properties['settings'][func_get_args( )];
}
}
?>
任何帮助都非常感谢。
谢谢!
答案 0 :(得分:2)
<?PHP
class Registry
{
// Values are actually fetched from a config file, but for easier understanding
private $properties = array(
'settings' => array(
'template' => array(
'default' => 'default',
'caching' => TRUE
)
)
);
public function getSetting()
{
$result = $this->properties;
foreach (func_get_args() as $arg) {
if (isset($result[$arg])) {
$result = $result[$arg];
} else {
return;
}
}
return $result;
}
}
$r = new Registry();
var_dump($r->getSetting('settings', 'template', 'default'));
?>
答案 1 :(得分:1)
嗯,我不确定这是不是你想要的,但这直接来自PHP手册:
可变长度参数列表
PHP 4及以上版本支持 可变长度参数列表 用户定义的函数。这真的是 很简单,使用func_num_args(), func_get_arg()和func_get_args() 功能
不需要特殊语法,并且 参数列表可能仍然是明确的 提供函数定义和 会表现得很正常。
我只是循环遍历参数并将它们输出到一个数组中(我可能会误解你的问题):
$output = array();
$arguments = func_get_args();
foreach ($argument as $arg)
{
$output[$arg] = $this->properties['settings'][$arg];
}
return $output;
祝你好运?
答案 2 :(得分:1)
不知道是否有PHP功能可以做到这一点,但我的方式也正常:
class Registry
{
// Values are actually fetched from a config file, but for easier understanding
private $properties = array(
'settings' => array(
'template' => array(
'default' => 'default',
'caching' => TRUE
)
)
);
public function getSetting( $array = array() )
{
$return = $this->properties['settings'];
foreach( $array as $a )
{
$return = $return[$a];
}
return $return;
}
}
然后使用:
$Registry = new Registry();
$template = $Registry->getSetting(array( 'template' ) );
$template_caching = $Registry->getSetting(array( 'template', 'caching' ) );
希望有所帮助:D
答案 3 :(得分:0)
使用dot作为嵌套数组的分隔符:
Registry::getAttribute('first.second.1.value'); // will return $ar['first']['second'][1]['value']
在.
的getAttribute explode param中,将其映射到注册表值。
答案 4 :(得分:0)
像这样(未经测试):
function getSetting ( /* .. */ )
{
$args = func_get_args();
array_unshift( $args, $this->properties );
return getSettingInternal( $args );
}
function getSettingInternal ( $args )
{
$arr = $args[0];
if ( count( $args ) > 1 )
{
$key = array_slice( $args, 1, 1 );
if ( !is_array( $arr ) )
return $arr;
$arr = array_key_exists( $arr, $key ) ? $arr[$key] : $arr['default'];
$args[0] = $arr;
return getSettingInternal( $args );
}
else
return $arr;
}