命名参数非常适合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'=>''
);
答案 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合并功能无法为我们做到这一点,但这是一个很好的选择。