我已经实现了以下小例子:
$nodeList;
for($i = 0; $i < 10;$i++) {
$nodeList[$i] = $i;
for($j = 0; $j < 3;$j++) {
$nodeList[$i][$j] = $j;
}
}
foreach($nodeList[0] as $nodeEl) {
print "NodeEl: ".$nodeEl." | ";
}
print nl2br("\n\r");
$testList = array
(
array(1,2,3),
array(4,5,6),
array(7,8,9),
array(10,11,12),
);
foreach($testList[0] as $testEl) {
print "TestEl: ".$testEl." | ";
}
$nodeList
的输出为null
(var_dump / print_r也是如此),$testList
的输出为TestEl: 1 | TestEl: 2 | TestEl: 3
,如预期的那样。
在我的理解中,这两个解决方案应该创建大致相同的输出 - 但是根本没有第一个输出。因为甚至没有创建数组的第二维。
阅读http://php.net/manual/de/language.types.array.php会产生强烈的感觉,即[]运算符仅用于解除引用/访问数组,但是文档再次提供了一个示例,用于指定值与我$arr["x"] = 42
的方式相同的某个键。
这两种阵列访问方式有什么区别?
如何以类似于我尝试填充$nodeList
的方式填充n维数组?
答案 0 :(得分:2)
您应该确保已启用错误报告,因为会为您的代码生成警告:
E_WARNING : type 2 -- Cannot use a scalar value as an array -- at line 7
这涉及以下声明:
$nodeList[$i] = $i;
如果要创建2D数组,则在第一级分配数字没有意义。相反,您希望$nodeList[$i]
成为一个数组。当您使用括号[...]
访问它时,PHP会隐含地(创建数组),因此您可以省略有问题的语句,然后执行:
for($i = 0; $i < 10;$i++) {
for($j = 0; $j < 3;$j++) {
$nodeList[$i][$j] = $j;
}
}
你甚至可以省略最后一个括号对中的$j
,这意味着PHP只会使用下一个可用的数字索引添加到数组中:
for($i = 0; $i < 10;$i++) {
for($j = 0; $j < 3;$j++) {
$nodeList[$i][] = $j;
}
}
如果你真的需要在{2}阵列的第一层存储$i
,那么考虑使用一个更复杂的结构,其中每个元素都是一个带有两个键的关联数组:一个用于值,另一个用于嵌套阵列:
for($i = 0; $i < 10; $i++) {
$nodeList[$i] = array(
"value" => $i,
"children" => array()
);
for($j = 0; $j < 3;$j++) {
$nodeList[$i]["children"][] = array(
"value" => "$i.$j" // just example of value, could be just $j
);
}
}
$nodeList
将是这样的:
array (
array (
'value' => 0,
'children' => array (
array ('value' => '0.0'),
array ('value' => '0.1'),
array ('value' => '0.2'),
),
),
array (
'value' => 1,
'children' => array (
array ('value' => '1.0'),
array ('value' => '1.1'),
array ('value' => '1.2'),
),
),
//...etc
);
答案 1 :(得分:1)
你应该写
<?php
$nodeList;
for($i = 0; $i < 10;$i++) {
for($j = 0; $j < 3;$j++) {
$nodeList[$i][$j] = $j;
}
}
foreach($nodeList[0] as $nodeEl) {
print "NodeEl: ".$nodeEl." | ";
}
答案 2 :(得分:0)
您需要将$nodeList
声明为
$nodeList=array();
和2D数组
$nodeList= array(array());