首页 > 编程笔记 > PHP笔记 阅读:9

PHP中的多维数组(构造、遍历和排序,非常详细)

PHP 按照数组的构造来分,可以把数组分为一维数组和多维数组。

数组中每个数组元素都是单个变量,无论是数字索引还是关联索引,这样的数组为一维数组。例如:
<?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

$roomtypes 中的每个数组元素都是一个数组,而作为数组元素的数组又都有三个拥有键名的数组元素。

遍历多维数组一般情况下需要嵌套循环或者递归循环,但是这些方式都不够灵活,因为在不确定该数组是几维的情况下,不可能永无止境地嵌套不够灵活,因为在不确定该数组是几维的情况下,不可能永无止境地嵌套循环。这里配合使用递归、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

函数 compare() 定义了排序方法,通过对 price_per_day 这一数组元素的对比进行排序。然后 usort() 采用 compare 方法对 $roomtypes 这一多维数组进行排序。

上述这个排序的结果是正向排序,那么如何进行反向排序呢?这就需要对排序方法进行调整。其中,recompare() 替换上述代码中的 compare() 的相反判断,同样采用 usort() 函数输出后,即可得到反向排序,正好与前一段程序的输出顺序相反。

相关文章