3.5 多维数组
数组不一定就是一个关键字和值的简单列表——数组中的每个位置还可以保存另一个数组。使用这种方法,可以创建一个二维数组。可以把二维组当成一个矩阵,或是一个具有宽度和高度或者行和列的网格。
如果希望保存Bob产品的多个数据,可以使用二维数组。图3-3用一个二维数组显示了Bob的产品,每一行代表一种产品,每一列代表一个产品属性。
图 3-3 可以用二维数组保存Bob产品的更多信息
使用PHP,可以编写如下代码来建立包含图3-3所示数据的数组:
$products=array(array('TIR','Tires',100),
array('OIL','Oil',10),
array('SPK','Spark Plugs',4));
可以从这个定义中看出$products数组现在包含3个子数组。
回顾前面所介绍的,为了访问一个一维数组中的数据,需要使用数组的名称和元素的索引。除了一个元素具有两个索引——行和列外,二维数组和一维数组是类似的(最上边的是第0行,最左边的是第0列)。
要显示这个数组的内容,可以使用代码按顺序手动访问每个元素:
echo'|'.$products[0][0].'|'.$products[0][1].'|'.$products[0][2].'|<br/>';
echo'|'.$products[1][0].'|'.$products[1][1].'|'.$products[1][2].'|<br/>';
echo'|'.$products[2][0].'|'.$products[2][1].'|'.$products[2][2].'|<br/>';
此外,还可以使用双重for循环来实现同样的效果:
for($row=0;$row<3;$row++){
for($column=0;$column<3;$column++){
echo'|'.$products[$row][$column];
}
echo'|<br/>';
}
以上两种代码都可以在浏览器中产生相同的输出,如下所示:
|TIR|Tires|100|
|OIL|Oil|10|
|SPK|Spark Plugs|4|
这两个例子唯一的区别就是,如果对一个大数组使用第二种代码,那么代码将简洁得多。
你可能更喜欢创建列名称来代替数字,如图3-3所示。要保存产品的相同集合,同时列名称为图3-3所给出的,可以使用如下所示的代码:
$products=array(array('Code'=>'TIR',
'Description'=>'Tires',
'Price'=>100
),
array('Code'=>'OIL',
'Description'=>'Oil',
'Price'=>10
),
array('Code'=>'SPK',
'Description'=>'Spark Plugs',
'Price'=>4
)
);
如果希望检索单个值,那么使用这个数组会容易得多。请记住,将所描述的内容保存到用它的名称命名的列中,与将其保存到所谓的第一列中相比,前者更容易记忆。使用描述性索引,不需要记住某个元素是存放在[x][y]位置的。使用一对有意义的行和列的名称作为索引可以使你很容易找到所需的数据。
然而,不能使用一个简单的for循环按顺序遍历每一列。使用如下代码可以显示这个数组内容:
for($row=0;$row<3;$row++){
echo'|'.$products[$row]['Code'].'|'.$products[$row]['Description'].
'|'.$products[$row]['Price'].'|<br/>';
}
可以使用for循环遍历外部的数字索引数组$products。$products数组的每一行都是一个具有描述性索引的数组。在while循环中使用each()和list()函数,可以遍历整个内部数组。
因此,需要一个内嵌有while循环的for循环。
for($row=0;$row<3;$row++){
while(list($key,$value)=each($products[$row])){
echo"|$value";
}
echo'|<br/>';
}
不必局限在二维数组上——按同样的思路,数组元素还可以包含新数组,这些新的数组又可以再包含新的数组。
三维数组具有高、宽、深的概念。如果能轻松地将一个二维数组想象成一个有行和列的表格,那么就可以将三维数组想象成一堆像这样的表格。每个元素可以通过层、行和列进行引用。
如果Bob要对他的产品进行分类,就可以使用一个三维数组来保存它们。图3-4显示了按三维数组方式保存的Bob产品。
图 3-4 三维数组允许你将产品分成不同的种类
通过这段定义了该数组的代码,可以发现三维数组是一个包含了数组的数组的数组。
$categories=array(array(array('CAR_TIR','Tires',100),
array('CAR_OIL','Oil',10),
array('CAR_SPK','Spark Plugs',4)
),
array(array('VAN_TIR','Tires',120),
array('VAN_OIL','Oil',12),
array('VAN_SPK','Spark Plugs',5)
),
array(array('TRK_TIR','Tires'150),
array('TRK_OLL','Oi1',15)
array('TRK_SPK','Spark Plugs'6)
)
);
因为这个数组只有数字索引,可以使用嵌套的for循环来显示它的内容,如下所示:
for($layer=0;$layer<3;$layer++){
echo"Layer$layer<br/>";
for($row=0;$row<3;$row++){
for($column=0;$column<3;$column++){
echo'|'.$categories[$layer][$row][$column];
}
echo'|<br/>';
}
}
根据创建多维数组的方法,可以创建四维、五维或六维数组。在PHP中,并没有设置数组维数的限制,但人们很难设想一个多于三维的数组。大多数的实际问题在逻辑上只需要使用三维或者更少维的数组结构就可以了。