Php 动态创建';n';带值的深度数组

Php 动态创建';n';带值的深度数组,php,multidimensional-array,Php,Multidimensional Array,我正在尝试创建一个类,通过它我应该能够创建任何深度的数组/值。但是我找不到办法。任何建议/提示/帮助都很好 这是密码 class CreateArray{ public function __construct() { } private $array = []; public function add_value($value){ $this->array[] = $value;

我正在尝试创建一个类,通过它我应该能够创建任何深度的数组/值。但是我找不到办法。任何建议/提示/帮助都很好

这是密码

    class CreateArray{
        public function __construct() {

        }

        private $array = [];
        public function add_value($value){
            $this->array[] = $value;
            return $this;
        }

        public function sub_array_start() {
            // What to do here?!
            return $this;
        }

        public function sub_array_end() {
            // What to do here?!
            return $this;
        }

        public function get() {
            return $this->array;
        }
    }

    $d_array = new CreateArray();
    $d_array = $d_array
                    ->add_value([1, 2, 3])
                    ->sub_array_start()
                        ->add_value([3, 2, 8])
                        ->add_value([4, 2, 5])

                        ->sub_array_start()
                            ->add_value([4, 2, 5])
                            ->add_value([3, 2, 8])
                        ->sub_array_end()

                        ->add_value([4, 2, 5])
                    ->sub_array_end()

                    ->add_value([1, 2, 3])
                    ->add_value([1, 2, 3])

                    ->sub_array_start()
                        ->add_value([3, 2, 8])
                        ->add_value([4, 2, 5])

                        ->sub_array_start()
                            ->sub_array_start()
                                ->add_value([3, 2, 8])
                                ->add_value([4, 2, 5])

                                ->sub_array_start()
                                    ->add_value([3, 2, 8])
                                    ->add_value([4, 2, 5])
                                ->sub_array_end()

                            ->sub_array_end()

                            ->add_value([3, 2, 8])
                            ->add_value([4, 2, 5])
                        ->sub_array_end()
                    ->sub_array_end();
                    ->get();
    print_r($d_array);
上述代码应创建如下数组-

    Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [1] => Array
        (
            [0] => Array
                (
                    [0] => 3
                    [1] => 2
                    [2] => 8
                )

            [1] => Array
                (
                    [0] => 4
                    [1] => 2
                    [2] => 5
                )

            [2] => Array
                (
                    [0] => Array
                        (
                            [0] => 4
                            [1] => 2
                            [2] => 5
                        )

                    [1] => Array
                        (
                            [0] => 3
                            [1] => 2
                            [2] => 8
                        )

                )

            [3] => Array
                (
                    [0] => 4
                    [1] => 2
                    [2] => 5
                )

        )

    [2] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [3] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [4] => Array
        (
            [0] => Array
                (
                    [0] => 3
                    [1] => 2
                    [2] => 8
                )

            [1] => Array
                (
                    [0] => 4
                    [1] => 2
                    [2] => 5
                )

            [2] => Array
                (
                    [0] => Array
                        (
                            [0] => Array
                                (
                                    [0] => 3
                                    [1] => 2
                                    [2] => 8
                                )

                            [1] => Array
                                (
                                    [0] => 4
                                    [1] => 2
                                    [2] => 5
                                )

                            [2] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => 3
                                            [1] => 2
                                            [2] => 8
                                        )

                                    [1] => Array
                                        (
                                            [0] => 4
                                            [1] => 2
                                            [2] => 5
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [0] => 3
                            [1] => 2
                            [2] => 8
                        )

                    [2] => Array
                        (
                            [0] => 4
                            [1] => 2
                            [2] => 5
                        )

                )

        )

)
我认为最简单(但肯定不是有效)的方法是在数组中保留一个简单的当前键列表。然后可以向下遍历并将值/子数组添加到正确的位置(如果不熟悉=&,请查看PHP手册中的参考资料)。代码:

class CreateArray{
    private $array = [];
    private $keys = [];
    public function __construct() {
    }

    public function add_value($value){
        $tmp =& $this->array;
        foreach ($this->keys as $key) {
            $tmp =& $tmp[$key];
        }
        $tmp[] = $value;
        return $this;
    }

    public function sub_array_start() {
        $tmp =& $this->array;
        foreach ($this->keys as $key) {
            $tmp =& $tmp[$key];
        }
        $tmp[] = [];
        end($tmp);
        $this->keys[] = key($tmp);
        reset($tmp);
        return $this;
    }

    public function sub_array_end() {
        array_pop($this->keys);
        return $this;
    }

    public function get() {
        return $this->array;
    }
}

注意:您有一个额外的
在上一个
子数组结束()之后,但在其他方面,示例代码是有效的(除非我在快速比较打印内容时忽略了一些内容)。

我很无聊,所以我开始了这个。我的大脑现在很累,但这可能会帮助你或其他人朝着正确的方向前进:

class CreateArray{

    private $array;
    private $previous;
    private $current;

    public function __construct(){
        $this->current =& $this->array;
    }

    public function add_value($value){
        $this->current[] = $value;
        return $this;
    }

    public function sub_array_start() {
        $this->previous =& $this->current;
        $this->current =& $this->array[];
        return $this;
    }

    public function sub_array_end() {
        $this->array =& $this->previous;
        $this->current =& $this->array;
        return $this;
    }

    public function get() {
        return $this->array;
    }
}

我找到了一个办法。虽然我不确定它是否完美。但这是我自己的解决方案-

class CreateArray{
    public function __construct() {

    }

    private $json_string = '';

    public function add_value($value){
        $value = json_encode($value, true);
        $this->json_string .= $value . ',';
        return $this;
    }

    public function sub_array_start() {
        $this->json_string .= '[';
        return $this;
    }

    public function sub_array_end() {
        $this->json_string = substr($this->json_string, 0, -1);
        $this->json_string .= '],';
        return $this;
    }

    public function get() {
        $value = '[' . $this->json_string . ']';
        $value = str_replace('],]', ']]', $value);
        $value = str_replace('},]', '}]', $value);
        $value = json_decode($value);
        return $value;
    }
}

这对类的构造没有帮助,但可能会帮助您解决这个问题:我担心
sub\u array\u start
sub\u array\u end
的概念确实不适合数组的使用方式work@RiggsFolly,一定有办法做到的!我对PHP不太在行,因此无法进一步思考:(这里有一个提示,您必须跟踪当前索引(或至少调用end())和数组指针的嵌套级别。即,您必须保持在数组中的位置状态。这不是诀窍。这在两个或更多连续的子数组上不起作用。)调用。你需要存储和还原所有以前的节点。这就是我对答案半途而废的原因。是的,这还不完整,我不希望有任何更新投票。也许你有使用这种方法的想法?应该能够以某种方式存储对最深层次的引用。我想你的想法是否适合干净的实现。你只需要使用某物。就像以前节点的堆栈。在那之后,剩下的只是一点繁忙的工作。例如,
$this->current=&$this->array[];
需要替换为“向current添加一个新的空数组,并使current指向它”。我太懒了,但可能其他人会这样做;或者我很无聊。JSON的有趣用法。很好。