PHP中的多维数组(构造、遍历和排序,非常详细)
PHP 按照数组的构造来分,可以把数组分为一维数组和多维数组。
数组中每个数组元素都是单个变量,无论是数字索引还是关联索引,这样的数组为一维数组。例如:
数组也是可以“嵌套”的,即每个数组元素也可以是一个数组,这种含有数组的数组就是多维数组。
例如:
可将上面的数组绘制成图,如下图所示:

图 1 二维数组
其实,$roomtypes 就代表了这样的一个数据表。
PHP 还支持二维以上的数组,比如三维数组,例如:

图 2 三维数组
下面以使用多维数组编写房间类型为例演示数组遍历,具体操作步骤如下:
遍历多维数组一般情况下需要嵌套循环或者递归循环,但是这些方式都不够灵活,因为在不确定该数组是几维的情况下,不可能永无止境地嵌套不够灵活,因为在不确定该数组是几维的情况下,不可能永无止境地嵌套循环。这里配合使用递归、foreach() 和迭代器类 RecursiveIteratorIterator,即可完美实现多维数组的循环输出。
首先需要设定一个排序方法,也就是建立一个排序函数。再通过 usort() 函数对特定数组采用特定排序方法进行排序。下面的案例介绍多维数组排序,具体步骤如下。
上述这个排序的结果是正向排序,那么如何进行反向排序呢?这就需要对排序方法进行调整。其中,recompare() 替换上述代码中的 compare() 的相反判断,同样采用 usort() 函数输出后,即可得到反向排序,正好与前一段程序的输出顺序相反。
数组中每个数组元素都是单个变量,无论是数字索引还是关联索引,这样的数组为一维数组。例如:
<?php $roomtypes = array( '单床房','标准间','三床房','VIP套房'); $prices_per_day = array('单床房'=> 298,'标准间'=> 268,'三床房'=> 198,'VIP套房'=> 368); ?>其中,$roomtypes 和 $prices_per_day 都是一维数组。
数组也是可以“嵌套”的,即每个数组元素也可以是一个数组,这种含有数组的数组就是多维数组。
例如:
<?php $roomtypes = array( array( 'type'=>'单床房', 'info'=>'此房间为单人单间。', 'price_per_day'=>298 ), array( 'type'=>'标准间', 'info'=>'此房间为两床标准配置。', 'price_per_day'=>268 ), array( 'type'=>'三床房', 'info'=>'此房间备有三张床', 'price_per_day'=>198 ), array( 'type'=>'VIP套房', 'info'=>'此房间为VIP两间内外套房', 'price_per_day'=>368 ) ); ?>$roomtypes 就是多维数组,这个多维数组包含两个维数,有点像数据库中的表格,第一个 array里面的每个数组元素都是一个数组,而这些数组就像数据二维表中的一行记录。这些包含在第一个 array 里面的 array 又都包含 3 个数组元素,分别是 3 个类型的信息,这就像数据二维表中的字段。
可将上面的数组绘制成图,如下图所示:

图 1 二维数组
其实,$roomtypes 就代表了这样的一个数据表。
PHP 还支持二维以上的数组,比如三维数组,例如:
<?php $building = array( array( 'type'=>'单床房', 'info'=>'此房间为单人单间。', 'price_per_day'=>298 ), array( 'type'=>'标准间', 'info'=>'此房间为两床标准配置。', 'price_per_day'=>268 ), array( 'type'=>'三床房', 'info'=>'此房间备有三张床', 'price_per_day'=>198 ), array( 'type'=>'VIP套房', 'info'=>'此房间为 VIP 两间内外套房', 'price_per_day'=>368 ), array( array( 'type'=>'普通餐厅包房', 'info'=>'此房间为普通餐厅包房。', 'roomid'=>201 ), array( 'type'=>'多人餐厅包房', 'info'=>'此房间为多人餐厅包房。', 'roomid'=>206 ), array( 'type'=>'豪华餐厅包房', 'info'=>'此房间为豪华餐厅包房。', 'roomid'=>208 ), array( 'type'=>'VIP餐厅包房', 'info'=>'此房间为 VIP 餐厅包房', 'roomid'=>310 ) ) ); ?>这个三维数组在原来的二维数组后面又增加了一个二维数组,给出了餐厅包房的数据二维表信息。把这两个二维数组作为更外围 array 的两个数组元素就产生了第三维。这个表述等于用两个二维信息表表示一个名为 $building 的数组对象,如下图所示。

图 2 三维数组
多维数组的遍历
所谓数组的遍历,就是把数组中的变量值读取出来。下面以使用多维数组编写房间类型为例演示数组遍历,具体操作步骤如下:
<?php $roomtypes = array( array('type'=>'单床房', 'info'=>'此房间为单人单间。', 'price_per_day'=>298), array('type'=>'标准间', 'info'=>'此房间为两床标准配置。', 'price_per_day'=>268), array('type'=>'三床房', 'info'=>'此房间备有三张床', 'price_per_day'=>198), array('type'=>'VIP套房', 'info'=>'此房间为VIP两间内外套房', 'price_per_day'=>368) ); $arrayiter = new RecursiveArrayIterator($roomtypes); $iteriter = new RecursiveIteratorIterator($arrayiter); // 直接打印即可按照横向顺序打印出来 foreach($iteriter as $key=>$val){ echo $key.'=>'.$val.'<br/>'; } ?>运行结果为:
type=>单床房
info=>此房间为单人单间。
price_per_day=>298
type=>标准间
info=>此房间为两床标准配置。
price_per_day=>268
type=>三床房
info=>此房间备有三张床
price_per_day=>198
type=>VIP套房
info=>此房间为VIP两间内外套房
price_per_day=>368
遍历多维数组一般情况下需要嵌套循环或者递归循环,但是这些方式都不够灵活,因为在不确定该数组是几维的情况下,不可能永无止境地嵌套不够灵活,因为在不确定该数组是几维的情况下,不可能永无止境地嵌套循环。这里配合使用递归、foreach() 和迭代器类 RecursiveIteratorIterator,即可完美实现多维数组的循环输出。
多维数组的排序
对于一维数组,通过 sort() 等一系列排序函数就可以对它进行排序。而对于多维数组,排序就没有那么简单了。首先需要设定一个排序方法,也就是建立一个排序函数。再通过 usort() 函数对特定数组采用特定排序方法进行排序。下面的案例介绍多维数组排序,具体步骤如下。
<?php $roomtypes = array( array('type'=>'单床房', 'info'=>'此房间为单人单间。', 'price_per_day'=>298 ), array('type'=>'标准间', 'info'=>'此房间为两床标准配置。', 'price_per_day'=>268 ), array('type'=>'三床房', 'info'=>'此房间备有三张床', 'price_per_day'=>198 ), array('type'=>'VIP套房', 'info'=>'此房间为 VIP 两间内外套房', 'price_per_day'=>368 ) ); function compare($x, $y){ if ($x['price_per_day'] == $y['price_per_day']){ return 0; } else if ($x['price_per_day'] < $y['price_per_day']){ return -1; } else { return 1; } } usort($roomtypes, 'compare'); $arrayiter = new RecursiveArrayIterator($roomtypes); $iteriter = new RecursiveIteratorIterator($arrayiter); // 直接打印即可按照横向顺序打印出来 foreach ($iteriter as $key => $val) { echo $key.'=>'.$val.'<br/>'; } ?>运行结果为:
type=>三床房
info=>此房间备有三张床
price_per_day=>198
type=>标准间
info=>此房间为两床标准配置。
price_per_day=>268
type=>单床房
info=>此房间为单人单间。
price_per_day=>298
type=>VIP套房
info=>此房间为 VIP 两间内外套房
price_per_day=>368
上述这个排序的结果是正向排序,那么如何进行反向排序呢?这就需要对排序方法进行调整。其中,recompare() 替换上述代码中的 compare() 的相反判断,同样采用 usort() 函数输出后,即可得到反向排序,正好与前一段程序的输出顺序相反。