我在一个不同的网站上遇到这个问题,在尝试了一个小时之后(可能是我周日的大脑)我放弃了。问题是:如果有一个函数foo
:
function foo(){}
该函数可以被调用为(参数可以是>= 2
,其中最后一个是值,前一个是数组的一部分。)
所以将函数调用为:
foo('arg1', 'value');
应该导致:
$array['arg1'] = 'value';
如果它有多个参数,则相同:
foo('arg1', 'argx', 'argz', 'value');
应该产生:
$array['arg1']['argx']['argz'] = 'value';
这是我的sad attempt:
function foo()
{
$items = func_get_args();
$value = array_pop($items);
$array = array_shift($items);
// Construct first element
$array = array($array => array());
foreach ($items as $el) {
insert_last($array, $value);
}
return $array;
}
function insert_last(&$array, $value)
{
$copy = $array;
while (true) {
$keys = array_keys($copy);
$last = $copy[$keys[count($copy)-1]];
var_dump($last);
if (empty($last)) {
$last = $value;
break;
}
$copy = $last;
}
var_dump($array, $copy);
}
非常确定可能有一个更简单的解决方案,我现在无法想到。谢谢!
答案 0 :(得分:4)
{{1}}
答案 1 :(得分:2)
<?php
function foo() {
$items = func_get_args();
if ( 1==count($items) ) {
return array_shift($items);
}
else {
$key = array_shift($items);
return array( $key=>call_user_func_array('foo', $items) );
}
}
var_dump(foo('arg1', 'argx', 'argz', 'value'));
编辑:没有func_get_args()但使用variadic function
的同样的事情<?php
function foo(...$items) {
if ( 1==count($items) ) {
return array_shift($items);
}
else {
$key = array_shift($items);
return array( $key=>call_user_func_array('foo', $items) );
}
}
var_dump(foo('arg1', 'argx', 'argz', 'value'));
答案 2 :(得分:1)
像
这样的东西function foo()
{
$args = func_get_args();
$items = array_pop($args);
foreach (array_reverse($args) as $item) {
$items = array($item => $items);
}
return $items;
}
var_dump(foo('arg1', 'argx', 'argz', 'value'));