将func_get_args连接到多维数组

时间:2015-10-04 22:32:47

标签: php arrays recursion multidimensional-array

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

非常确定可能有一个更简单的解决方案,我现在无法想到。谢谢!

3 个答案:

答案 0 :(得分:4)

{{1}}

Demo

答案 1 :(得分:2)

使用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'));

编辑:没有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'));

Demo