PHP在方法中使用Closure将项目推送到嵌套数组

时间:2016-03-24 15:01:08

标签: php arrays multidimensional-array callback closures

navigation.php

NavigationHelper::item('Main page', function($item) {
    $item->item('first sub-item', null);
    $item->item('second sub-item', function($item) {
        $item->item('third level sub');
    });
});

NavigationHelper.php

class NavigationHelper {

    protected $items = [];
    private static $_instance;

    public static function item($name, \Closure $children = null)
    {
        $c = static::_ini();

        $c->items[] = array(
            'name'  =>  $name,
            'childrens' => []//@todo
        );

        if ($children instanceof \Closure) {
            call_user_func($children, $c);
        }
    }

    protected static function _ini()
    {
        if (!static::$_instance) {
            static::$_instance = new static;
        }

        return static::$_instance;
    }
}

所以我试图创建一个NavigationHelper类,它使用php闭包推送嵌套数组中的项目。在navigation.php文件中,我正在添加项目'主页面'而他的孩子应该是第一个子项目'和'第二个子项目' (最后一个应该有'第三级子')。

上面的代码将所有项目推送到数组,但我不明白如何将这些子项嵌套到父母身上。

我尝试将index设置为创建元素,并在调用closure函数之前将这些索引作为父id传递,但是如果子节点有子节点,则会覆盖此父ID,其他子节点将转到子子节点...

$c->items[$c->index] = array(
    'name'  =>  $name,
    'parent'    =>  $c->parent
);
$c->index++;

if ($children instanceof \Closure) {
    $c->parent = $c->index;
    call_user_func($children, $c);
}

我想要一些可以解决我的问题的帮助,是否有可能使用附加参数(如当前数组索引)调用回调函数? 也许其他一些建议?

0 个答案:

没有答案