PHP - синтаксис для списка массивов в одной переменной - PullRequest
1 голос
/ 26 октября 2019

У меня есть очень сложный массив, который содержит много других очень сложных вложенных массивов. Я хочу разбить некоторые внутренние группы массивов на отдельные переменные вне основной переменной для удобства чтения, однако я не уверен, каков правильный синтаксис для наличия списка нескольких массивов в одной переменной.

Завершение списка массивов в массиве при объявлении переменной не вариант, так как переменная будет вставлена ​​внутрь массива-оболочки позже в переменную $ array, поэтому список массивов должен быть на ихсобственный, а не внутри массива в переменной $ sub_arrays.

<?php

$sub_arrays = array(), array(), array(); // syntax error

$array = array(
    'template' => array(
        array(
            array(),
            array(
                array(),
                // syntax error
                $sub_arrays,

                // this works, but need to be declared outside
                // array(), array(), array(),
                array(),
            )
        ),
    ),
);

print_r($array);

https://3v4l.org/2EvRA

В качестве альтернативы, можно разделить некоторые вложенные массивы в другой файл .php и использовать include () и возврат также будет вариант вместо переменной? Но я не уверен насчет синтаксиса этого тоже.

Разделение было бы полезно не только для удобочитаемости, но и в случае необходимости повторного использования определенной группы массивов в другом экземпляре.

Данные представляют собой шаблон редактора блоков WordPress (Gutenberg) с множеством вложенных блоков групп и столбцов внутри других блоков. https://developer.wordpress.org/block-editor/developers/block-api/block-templates/#nested-templates

Это вообще возможно сделать в PHP?

Ответы [ 5 ]

4 голосов
/ 29 октября 2019

Новый ответ:

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

Первое решение: Первое - самое простое, но для его работы требуется PHP 7.4+.

Вы можете использовать новую функцию, которая называется оператором уклона. (...) где вы можете "распаковать" один массив в другой. Вот пример:

<?php
$sub_arrays = [array("middle" => "array"), array(), array("external"=>"array")];

$array = array(
    'template' => array(
        array(
            array(),
            array(
               array('first'=>"array"),
                ...$sub_arrays, // use it here
                array('last'=>"array")
            )
        ),
    ),
);

print_r($array);

Демонстрация в реальном времени: https://3v4l.org/s4Q8u

Второе решение: Это немного сложнее, чем первое. Это включает обертывание массива в функцию и динамическое создание родительского массива $ sub_arrays. Смотрите это:

<?php
$sub_arrays = [array("middle" => "array"), array(), array("external"=>"array")];

function create_array($sub) {
    $parent_array[] = array('first'=>"array");

    foreach($sub as $s)
    {
         $parent_array[] = $s;
    }

    $parent_array[] = array('last'=>"array");

    $array = array(
        'template' => array(
            array(
                array(),
                $parent_array
            ),
        ),
    );

    return $array;
}
print_r(create_array($sub_arrays));

Демонстрация в реальном времени: https://3v4l.org/1Vahd

Надеюсь, это поможет.


Старый ответ:

Ваши вопросы опускают много деталей, чтобы понять, почему вы пытаетесь это сделать.

Например:

Заключение списка массивов в массивхотя объявление переменной не является опцией,

как $ sub_array вставляется в массив $, на каком этапе они находятся внутри класса или функции?

В любом случае, из того, что я понял, я думаю, список - это то, что вы ищете.

См. Этот пример:

<?php
list($a, $b) = [array('example' => 'test'), array('another' => 'array')];


var_dump($a, $b);

Вы также можете использовать список для вложенных массивов, например:

list($a, list($b, $c)) = [array('example' => 'test'), array(array('another' => 'array'), array('I am nested'=>'array'))];

var_dump($a, $b, $c);
1 голос
/ 01 ноября 2019

Я собираюсь попытаться упростить проблему и определить некоторые переменные следующим образом:

$firstArray = $a; 
$subArrays = [$i, $j, $k]; 
$lastArray = $z;

, где $a, $i, $j, $k и $zвсе ли массивы

Я считаю, что вы пытаетесь достичь

$result = [$a, $i, $j, $k, $z]

без ссылки на переменные $a, $i, $j, $k или $z


Этого можно достичь с помощью array_merge(), при условии, что массивы не связаны с дублирующимися ключами

$result = array_merge([$firstArray], $subArrays, [$lastArray]);

Что эквивалентно

$result = array_merge([$a], [$i, $j, $k], [$z]);

Оборачивая $firstArray и $lastArray в свои собственные массивы, это ставит их на тот же уровень вложенности, что и $subArrays, прежде чем объединить их все в один массив


Применение всего этого к исходной проблеме и использование более длинного синтаксиса приводит к

$sub_arrays = array(array(), array(), array()); // Wrapped

$array = array(
    'template' => array(
        array(
            array(),
            array_merge(
                array(array()), // Wrapped
                $sub_arrays,
                array(array()), // Wrapped
            ),
        ),
    ),
);
1 голос
/ 30 октября 2019

Не могли бы вы попробовать это:

<?php

$sub_arrays = array(array(), array(), array()); // no syntax error

$array = array(
    'template' => array(
        array(
            array(),
            array(
                array_merge(
                array(array()),
                $sub_arrays),
                 array(),
            )
        ),
    ),
);

print_r($array);

Чтобы это сработало, вы должны объединить ваш массив "outsider" с существующим. Существующий должен быть заключен в массив

1 голос
/ 29 октября 2019

Вы можете предпочесть более короткий синтаксис массива, доступный начиная с PHP 5.4

<?php

$arr1 = ['a', 'b', 'c'];      // >= 5.4
$arr2 = array('a', 'b', 'c'); //  < 5.4

Смотрите здесь информацию о кратком синтаксисе и массивах в целом: https://www.php.net/manual/en/language.types.array.php

Использование краткого синтаксиса вашего вложенногомассив может выглядеть так:

<?php

$arr = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];

Пример выше - это двумерный вложенный массив. Внешний массив имеет три элемента, которые сами являются массивами.

Чтобы include / require массив (или любое другое значение) из другого файла PHP просто сделайте это так: $returnValue = require('./other_file.php').

В other_file.php что-то вроде этого будет работать:

<?php

return [
    [
        [1, 2, 3],
        [4, 5, 6],
    ],
    [
        [9, 8, 7],
        [6, 5, 4],
    ],
];

Надеюсь, это поможет.

1 голос
/ 26 октября 2019

Я не уверен, что вы просите, но если это как создать переменные массива и использовать их позже, то вот пример. Я взял пример WordPress, который вы указали в комментариях. Это массивы шаблонов, разбитые на разделы. Структура, кажется, следует шаблону, надеюсь, это проясняет ее.

$templateTop = array(
    'core/paragraph'        =>  array(
        'placeholder'           =>  'Add a root-level paragraph',
    )
);

$column1 = array(
    'core/column',
    array(),
    array(
        array(
            'core/image',
            array()
        ),
    )
);

$column2 = array(
    'core/column',
    array(),
    array(
        array(
            'core/paragraph',
            array(
                'placeholder' => 'Add a inner paragraph'
            )
        ),
    )
);

$templateColumns = array(
    'core/columns',
    array(),
    array(
        $column1, $column2
    )
);

$template = array(
    $templateTop, $templateColumns
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...