我在另一个网站上遇到了这个问题,在尝试了一个小时(可能是我周日的大脑(后,我放弃了。问题是:如果存在函数foo
:
function foo(){}
函数可以被调用为(参数可以是>= 2
,其中最后一个始终是值,前一个是数组的一部分(。
因此,将函数调用为:
foo('arg1', 'value');
应导致:
$array['arg1'] = 'value';
如果它有一个以上的参数,也是一样的:
foo('arg1', 'argx', 'argz', 'value');
应生产:
$array['arg1']['argx']['argz'] = 'value';
这是我可悲的尝试:
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);
}
可以肯定的是,可能有一个更简单的解决方案,我现在想不出来。谢谢
function foo()
{
$items = func_get_args();
$value = array_pop($items);
$array = [];
$arrayPtr = &$array;
foreach ($items as $element) {
$arrayPtr[$element] = null;
$arrayPtr = &$arrayPtr[$element];
}
$arrayPtr[$element] = $value;
return $array;
}
var_dump(foo('arg1', 'argx', 'argz', 'value'));
演示
通过使用call_user_func_array((的递归
<?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'));
edit:没有func_get_args((也一样,但使用了可变函数
<?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'));
像这样的东西怎么样
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'));
演示