0

命名参数非常适合 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

4 回答 4

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;
}
于 2011-01-28T16:00:02.740 回答
1

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

于 2011-01-28T15:59:53.630 回答
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);

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

编辑:

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

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
)
于 2011-01-28T16:00:31.380 回答
0

看看我在CakePHP 框架中发现了什么:

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 合并功能不能为我们做到这一点,但这是一个很好的选择。

于 2011-01-28T17:53:03.617 回答