如何声明一个二维数组?

102

如何最简单地创建一个二维数组?我希望能够做类似于这样的事情:

declare int d[0..m, 0..n]
16个回答

92

您还可以通过指定数组的索引创建关联数组或"哈希表"。

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => 'john@example.com'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => 'jane@example.com'
    ),
);

这等同于什么?

$array = array();

$array[0] = array();
$array[0]['name'] = 'John Doe';
$array[0]['email'] = 'john@example.com';

$array[1] = array();
$array[1]['name'] = 'Jane Doe';
$array[1]['email'] = 'jane@example.com';

2
我们如何使用循环语句创建相同的数组? - Anoop Pete
在第二个代码片段中,两个重复的代码块将被放入循环中,并且数值索引将被逐次递增的变量所替代。 - Atli
1
@AnoopPete:for ($i=0; $i<count($array); $i++){ print($array[$i]['name']); } - Dax

69

以下等价且结果为二维数组:

$array = array(
    array(0, 1, 2),
    array(3, 4, 5),
);
或者
$array = array();

$array[] = array(0, 1, 2);
$array[] = array(3, 4, 5);

9
这不会产生二维数组,而是生成一个包含多个数组的数组。 - dotancohen
7
这只是措辞上的区别,实际上这两个概念几乎相同。那里展示的与类似于C#语言中使用的多维数组之间唯一的区别就是语法,而且语法上的差异相当小。 - Atli
1
在C#中,内存需求是不同的。数组的数组仅分配每个数组所需的内存量。而二维数组则会分配整个N * M的内存。 - dotancohen
7
@dotancohen 一般来说,PHP和C#的内存需求非常不同,因为每种语言的运行时都有自己处理内存的方式。在实践中通常不需要太关注这个问题,除非你正在构建某种长时间运行、高性能的应用程序,比如游戏,那么选择PHP作为编程语言会很奇怪。 - Atli

50

只是声明吗?你不需要这样做。只要确保变量存在即可:

$d = array();

数组可以动态调整大小,尝试向不存在的元素写入任何内容将创建它(如果需要将创建整个数组)

$d[1][2] = 3;

这对于任何数量的维度都是有效的,无需先进行声明。


4
除了告诉你它不是“稀疏”的并且没有给出其维度信息。如果你正在声明一个M x N的二维数组,很可能它是一个矩阵,而且如果它是一个矩阵,你将需要对其进行乘法或其他运算,这将需要遍历元素,如果它是“稀疏”的并且你不知道其维度,那么你就无法做到这一点。 - cletus
@cletus:你可以在正确的维度上使用count,例如count($d[1]),除非我误解了你的意思? - DisgruntledGoat
2
然而,PHP并没有多维数组。数组中可能存在稀疏的数组。那么,我们可以考虑使用数组实现矩阵的类,这样至少你会更加注意正确的实现。 - Don

29

首先,PHP没有多维数组,它只有数组的数组。

其次,您可以编写一个函数来实现它:

function declare($m, $n, $value = 0) {
  return array_fill(0, $m, array_fill(0, $n, $value));
}

2
你是不是想说“数组 数组”,而不是“数组 或者 数组”? - Asaph
1
设置一个零数组是完全没有意义的练习。你不需要声明一个数组,只需使用它即可。 - DisgruntledGoat
10
除非您需要遍历它或确定其大小(例如进行矩阵乘法),否则最好不要填充数组值。但是,有一个完全合理的情况可以填充数组值。 - cletus

14

针对一种简单的“填充即用”的解决方案:

$foo = array(array());

这样可以得到一个灵活的伪二维数组,它可以容纳 $foo[n][n],其中 n <= ∞(当然,你受内存大小的限制,但我希望你能理解这个概念)。在理论上,可以扩展到创建所需的任意子数组。


11

对于长度较大且所有值相同的数组:

$m_by_n_array = array_fill(0, $n, array_fill(0, $m, $value);

将创建一个 $m$ 行 $n$ 列的数组,并将所有元素设置为 $value$。


6

atli的回答真的帮助我理解了这个问题。下面是如何迭代遍历一个二维数组的示例。该示例展示了如何查找数组中已知名称的值以及使用foreach遍历所有字段。希望对某些人有所帮助。

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => 'john@example.com'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => 'jane@example.com'
    ),
);

foreach ( $array  as $groupid => $fields) {
    echo "hi element ". $groupid . "\n";
    echo ". name is ". $fields['name'] . "\n";
    echo ". email is ". $fields['email'] . "\n";
    $i = 0;
    foreach ($fields as $field) {
         echo ". field $i is ".$field . "\n";
        $i++;
    }
}

输出:

hi element 0
. name is John Doe
. email is john@example.com
. field 0 is John Doe
. field 1 is john@example.com
hi element 1
. name is Jane Doe
. email is jane@example.com
. field 0 is Jane Doe
. field 1 is jane@example.com

3
据我所知,没有内置的PHP函数可以做到这一点,您需要通过循环或自定义方法来实现,该方法会递归调用像@Amber的答案中指示的array_fill之类的东西。
我假设你的意思是创建一个空但已初始化的数组。例如,您希望最终结果如下所示:包含3个数组的数组
   $final_array = array(array(), array(), array());

这个可以手动编写,但对于像三个三维数组这样大小任意的数组,在使用前初始化就开始变得复杂了:

     $final_array = array(array(array(), array(), array()), array(array(), array(), array()), array(array(), array(), array()));

我理解您的烦恼。如果有一种简单的方法来声明一个初始化的数组,可以在任何深度上使用,而无需检查或抛出错误,那将是很好的。


2

对我来说,关于数组是否应该是稀疏的这个论点取决于上下文。

例如,如果$a[6][9]没有被填充,则相当于在$a[6][9]中填入了""或0等内容。


1
$r = array("arr1","arr2");

要回显单个数组元素,应该写:

echo $r[0];
echo $r[1];

输出将是:arr1 arr2

2
这是一个一维数组。多维数组至少包含一个数组内嵌在另一个数组中。 - Mike Stratton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接