PHP中嵌套的命名参数

时间:2011-01-28 15:47:10

标签: php named-parameters multidimensional-array

命名参数非常适合PHP用户定义函数或类中的一长串选项。但是嵌套选项呢?

例如:

function foobar($foo,$bar,$options=array()) {

    $default_options = array('option1'=>'','option2'=>'hello','option3'=>array('option1'=>true,'option2'=>''));

    $options = array_merge($default_options,(array)$options);
}

因此选项3是另一个带有子选项的数组。我们是否需要将它们放在for循环中以合并子选项?在这种情况下你们会做什么?

修改

这是函数调用:

foobar('foo','bar',array('option1'=>'foo','option3'=>array('option1'=>false)));

$ options的结束结构:

array(
'option1'=>'foo',
'option2'=>'hello',
'option3'=>array(
    'option1'=>false,
    'option2'=>''
);

4 个答案:

答案 0 :(得分:2)

array_merge_recursive(),但它可能无法达到您的预期效果。

以下是递归版或array_merge(),其实际行为与array_merge()类似:

function array_merge_recursive_2($a, $b) {
        foreach($b as $key => $value) {
                if (isset($a[$key]) && is_array($a[$key]) && is_array($value)) {
                        $a[$key] = array_merge_recursive_2($a[$key], $value);
                } else {
                        $a[$key] = $value;
                }
        }
        return $a;
}

答案 1 :(得分:1)

使用array_merge_recursive()。这也将合并子数组。

答案 2 :(得分:1)

为什么不使用func_get_args功能?

function yourFunction($keys) {
    $default_options = array('test', array('test1' => array('test2')), 'test3');
    $options = func_get_args();
    array_shift($options);

    $options = array_combine($keys, $options); 
    $options = array_merge($default_options, $options);

    print_r($options);
}

// Usage
yourFunction(array('option1', 'option2', 'option3', 'option4'), 'optionval1', array('optionval2-1', 'optionval2-2'), 'optionval3', 4);

这样你就可以开始使用数组了,不需要担心任何其他事情,它可以接受任意数量的参数/参数!

修改

(第二次编辑,添加$键作为第一个参数) 修改了上面的功能,这里是输出。不确定您正在寻找什么样的输出格式。因此,您可能需要发布所需的结束数组结构,以获取给定的初始数据。

Array
(
    [0] => test
    [1] => Array
        (
            [test1] => Array
                (
                    [0] => test2
                )

        )

    [2] => test3
    [option1] => optionval1
    [option2] => Array
        (
            [0] => optionval2-1
            [1] => optionval2-2
        )

    [option3] => optionval3
    [option4] => 4
)

答案 3 :(得分:0)

看看我在CakePHP framework中找到了什么:

function merge($arr1, $arr2 = null) {

    $args = func_get_args();

    $r = (array)current($args);

    while (($arg = next($args)) !== false) {
        foreach ((array)$arg as $key => $val)    {
            if (is_array($val) && isset($r[$key]) && is_array($r[$key])) {
                $r[$key] = merge($r[$key], $val);
            } elseif (is_int($key)) {
                $r[] = $val;
            } else {
                $r[$key] = $val;
            }
        }
    }


    return $r;
}

遗憾的是,内置的PHP合并功能无法为我们做到这一点,但这是一个很好的选择。