将func_get_args连接到多维数组中



我在另一个网站上遇到了这个问题,在尝试了一个小时(可能是我周日的大脑(后,我放弃了。问题是:如果存在函数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'));

演示

相关内容

  • 没有找到相关文章

最新更新