Динамически создать массив глубины n со значениями - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь создать класс, с помощью которого я смогу создать массив с любой глубиной массивов / значений. Но я не могу найти способ сделать это. Любые предложения / советы / подсказки будут хороши.

Вот коды

    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
                        )

                )

        )

)

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Мне было скучно, поэтому я начал это. Мой мозг устал, но, возможно, это поможет вам или кому-то еще в правильном направлении:

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;
    }
}
0 голосов
/ 06 июля 2018

Я нашел способ сделать это. Хотя я не уверен, идеально ли это или нет. Но вот мое собственное решение -

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;
    }
}
0 голосов
/ 06 июля 2018

Я думаю, что самый простой (но, безусловно, не эффективный) способ - это хранить простой простой список текущих ключей внутри вашего массива. Затем вы можете перейти вниз и добавить свои значения / вложенные массивы в нужное место (если = & незнакомо, обратитесь к руководству по 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;
    }
}

Примечание : у вас есть дополнительные ; после вашего последнего sub_array_end(), но в противном случае пример кода работает (если я не пропустил что-то во время быстрого сравнения print_r's;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...