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);
或者,将一些子数组分离到另一个 .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);
第二种解决方案:这比第一种复杂一点。它涉及将数组包装到函数中并动态创建 $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));
希望对您有所帮助。
旧答案:
你的问题遗漏了很多细节来理解你为什么要这样做。
例如:
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
),
),
),
);
我有一个非常复杂的数组,其中包含许多其他非常复杂的嵌套数组。我想将一些内部数组组分解成主变量之外的单独变量以提高可读性,但是我不确定在单个变量中包含多个数组列表的正确语法是什么。
在声明变量的同时将数组列表包装在数组中不是一个选项,因为稍后变量将插入包装器数组中的 $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);
或者,将一些子数组分离到另一个 .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);
第二种解决方案:这比第一种复杂一点。它涉及将数组包装到函数中并动态创建 $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));
希望对您有所帮助。
旧答案:
你的问题遗漏了很多细节来理解你为什么要这样做。
例如:
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
),
),
),
);