使用函数参数访问更深的数组键

时间:2011-01-30 14:32:30

标签: php

我正在尝试创建一个函数(除非已存在?),它应该接受“无限制”的参数(使用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( )];
    }
}
?>

任何帮助都非常感谢。
谢谢!

5 个答案:

答案 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;
}