PHP - 单个变量中数组列表的语法

PHP - syntax for list of arrays in a single variable

我有一个非常复杂的数组,其中包含许多其他非常复杂的嵌套数组。我想将一些内部数组组分解成主变量之外的单独变量以提高可读性,但是我不确定在单个变量中包含多个数组列表的正确语法是什么。

在声明变量的同时将数组列表包装在数组中不是一个选项,因为稍后变量将插入包装器数组中的 $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() 和 return 也是一个选项而不是变量?但我也不确定它的语法。

分离不仅对可读性有好处,而且还可以防止特定的一组数组也需要在另一个实例中重用。

数据是一个 WordPress 块编辑器 (Gutenberg) 模板,在其他块中有很多嵌套的组和列块。 https://developer.wordpress.org/block-editor/developers/block-api/block-templates/#nested-templates

这甚至可以在 PHP 中完成吗?

我不确定你在问什么,但如果是如何创建数组变量并在以后使用它们,那么这里有一个例子。我以您在评论中链接的 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
);

您可能更喜欢自 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],
    ],
];

希望这对您有所帮助。

新答案:

根据下面的评论,我想我明白了这个问题。我可以想到两种解决方案。

第一个解法: 第一个很简单,但你需要 PHP 7.4+ 才能运行。

您可以使用称为倾斜运算符 (...) 的新功能,您可以在其中 "unpack" 将一个数组转换为另一个数组。这是示例:

<?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

希望对您有所帮助。


旧答案:

你的问题遗漏了很多细节来理解你为什么要这样做。

例如:

Wrapping the list of arrays in an array while declaring the variable isn't an option,

$sub_array 是如何插入到 $array 中的,在什么阶段,它们是在 class 还是函数中?

无论如何,据我了解,我认为list就是您要找的。

看这个例子:

<?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);

你能试试这个吗:

<?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" 数组与现有数组合并。现有的必须封装成数组

我将尝试简化问题,并定义一些变量如下

$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
            ),
        ),
    ),
);