在php

时间:2016-07-09 10:37:23

标签: php arrays multidimensional-array

我已经实现了以下小例子:

$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维数组?

3 个答案:

答案 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());