如何声明一个二维数组?


91

创建2d数组的最简单方法是什么。我希望能够做类似的事情:

declare int d[0..m, 0..n]

Answers:


81

您还可以通过指定数组的索引来创建关联数组或类似“哈希表”的数组。

$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';

1
我们如何使用循环语句创建相同的数组?
Anoop Pete

@ Anoop-Pete在第二个代码段中,将两个重复的块放入循环中,并将数字索引替换为每次迭代递增的变量。
Atli 2012年

1
@AnoopPete:对于($ i = 0; $ i <count($ array); $ i ++){print($ array [$ i] ['name']); }
Dax

64

以下是等效项,并产生一个二维数组:

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

要么

$array = array();

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

7
这些不会导致二维数组,而是会导致数组数组。
dotancohen 2012年

5
@dotancohen真的,这只是语义。实际上,这两个概念是相同的。此处演示的内容与C#等语言中使用的多维数组类型之间的唯一区别是语法。语法上的差别很小。
Atli 2013年

1
至少在C#中,内存要求是不同的。数组数组仅分配每个数组所需的内存量。二维数组分配整个N * M的内存。
dotancohen

6
@dotancohen PHP和C#之间的内存要求通常大不相同,因为每种语言的运行时都有自己的内存处理方式。在实践中,这通常不是您关心的问题。除非您碰巧正在构建某种长期运行的高性能应用程序(例如游戏),否则PHP将是一种奇怪的语言选择。
Atli 2014年

40

只是声明?不用了 只要确保变量存在:

$d = array();

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

$d[1][2] = 3;

在没有事先声明的情况下,这对于任何数量的尺寸均有效。


3
除此之外,您对尺寸一无所知。如果要声明一个M x N 2D数组,则可能是一个矩阵,如果是矩阵,则可能要进行乘法运算或对它进行某些操作,这需要对元素进行迭代,如果它是迭代的,则无法执行“稀疏”,不知道尺寸。
cletus

@cletus:count不过,您可以使用正确的尺寸,例如count($d[1]),除非我误解了您的观点?
不满的

2
尽管如此,PHP仍没有多维数组。总是存在数组稀疏的可能性。因此,如何制作一个使用数组实现矩阵的类,至少您会更加注意正确的实现。

26

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

其次,您可以编写一个函数来执行此操作:

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

2
难道你的意思是“数组数组”,而不是“阵列阵”?
Asaph,2009年

@Asaph:是的,我做到了。固定。谢谢。
cletus

1
设置零数组是完全没有意义的练习。您无需声明数组,只需使用它即可。
不满的山羊

7
除非您需要对其进行迭代或确定其大小,例如说要进行矩阵乘法。有一个完全有效的情况来填充数组值。
cletus

11

对于简单的“随用随付”解决方案:

$foo = array(array());

这将为您提供一个灵活的伪二维数组,该数组可以容纳$ foo [ n ] [ n ],其中n <=∞(当然,您受通常的内存大小限制所限制,但是您希望得到这个主意)。从理论上讲,这可以扩展为创建所需数量的子数组。


9

或对于更大的数组,所有数组都具有相同的值:

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

将创建一个$mby $n数组,并将所有内容设置为$value


3

据我所知,没有内置的php函数可以做到这一点,您需要通过循环或通过递归调用@Amber答案中指示的array_fill之类的自定义方法来完成此操作。

我假设您的意思是创建一个空的但初始化的数组数组。例如,您希望最终结果像下面的3个数组一样

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

这仅是简单的手工代码,但是对于任意大小的数组(如3个数组中的3个数组),在使用之前初始化起来变得很复杂:

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

...等等...

我感到沮丧。最好有一种简单的方法来声明一个初始化的数组数组,该数组的深度可以使用而无需检查或抛出错误。


3

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

2

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

例如,如果未填充$ a [6] [9],则等价于$ a [6] [9]填充有例如“”或0。


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

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

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

输出将是: arr1 arr2


2
这是一维数组。多维数组至少在一个数组中具有一个数组。
迈克·斯特拉顿

2

我喜欢这样:

$cars = array
  (
  array("Volvo",22),
  array("BMW",15),
  array("Saab",5),
  array("Land Rover",17)
  );

0

如果您想使用一个内衬快速为简单值创建多维数组,我建议使用此数组库来做到这一点:

$array = Arr::setNestedElement([], '1.2.3', 'value');

会产生

[
  1 => [
    2 => [
      3 => 'value'
    ]
  ]
]

0

您可以尝试这样做,但是第二维值将等于索引:

$array = array_fill_keys(range(0,5), range(0,5));

对于空数组,要稍微复杂一点:

$array = array_fill_keys(range(0, 5), array_fill_keys(range(0, 5), null));


0

您需要在另一个数组中声明一个数组。

$arr = array(array(content), array(content));

例:

$arr = array(array(1,2,3), array(4,5,6));

要从数组中获取第一项,您将使用$arr[0][0],就像从数组中的第一个数组中获取第一项一样。 $arr[1][0]将从数组的第二个数组返回第一项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.