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() 函数输出后,即可得到反向排序,正好与前一段程序的输出顺序相反。
ICP备案:
公安联网备案: