代码改变世界

第三章 使用数组(3)

2016-07-22 13:02  yojiaku  阅读(152)  评论(0编辑  收藏  举报
  • 多维数组的排序  

    用户定义排序:像下面的代码,我们知道各个数组内容所代表的意义,所以至少有两种有用的排序方法。我们可以对产品的说明按字母排序,也可以对价格的大小排序,我们需要使用

           函数usort()告诉PHP如何比较各个元素。

//create a two-dimensional array
$products7 = array(array('TIR','Tires',100),
                    array('OIL','Oil',10),
                    array('SPK','Spark Plugs',4));
//compile a function to compare x and y
function compare($x,$y){
    if ($x[1]==$y[1]){
        return 0;
    }else if($x[1]<$y[1]){
        return -1;
    }else{
        return 1;
    }
}
//use function compare to sort the array
usort($products7,'compare');

 

    explain:我们用关键词function定义一个函数,需要给出函数的名称,这里名称为"compare",compare()函数带有两个参数 "$x","$y" ,在这里,$x,$y将是主数组中的两个子数组,分别代表一种产品。

        因为计数是从0开始的,说明字段是这个数组的第二个元素,所以为了访问数组$x的说明字段(Tires,Oil,Spark Plugs),需要输入$x[1]和$y[1]来比较两个传递给函数的数组的说明字段。

        usort()中的"u"代表"user",因为 这个函数要求传入用户定义的比较函数('compare')。

        上面的代码没有产生任何输出,我们依旧用双重for循环来输出这个数组:

//show this array in the browser
for($row = 0;$row < 3;$row++){
    for($column = 0;$column < 3;$column++){
        echo " ".$products7[$row][$column];
    }
    echo "<br />";
}

       显示结果为:

       我们注意到,这是按照字母O,S,T的大小来排序的。

    反向用户排序:函数sort(),asort(),ksort()都分别对应着一个带字母"r"的反向排序函数。但是用户定义的排序没有反向变体,但我们可以编写一个能够返回相反值得比较函数,例如:

function reverse_compare($x,$y){
    if ($x[1]==$y[1]){
        return 0;
    }else if($x[1]>$y[1]){
        return -1;
    }else{
        return 1;
    }
}
  • 对数组进行重新排序

    使用shuffle()函数:我们依旧用Bob汽车商店的例子——Bob想让其网站首页上的产品能够反映出公司的特色。(他拥有许多产品,但希望能够随机地选出3种产品显示在首页上,为了

             不至于让多次登录的访问者感到厌烦,他想让每次访问看到的3中产品都不同)

             下面给出程序代码:程序清单3-1 Bob's_front_page.php —— 使用PHP为Bob的汽车配件商店制作一个动态首页

<?php
$pictures = array('tire.jpg', 'oil.jpg', 'spark_plug.jpg',
    'door.jpg', 'steering_wheel.jpg',
    'thermostat.jpg', 'wiper_blade.jpg',
    'gasket.jpg', 'brake_pad.jpg');

shuffle($pictures);
?>
<html>
<head>
    <title>Bob's Auto Parts</title>
</head>
<body>
    <h1>Bob's Auto Parts</h1>
    <div align="center">
        <table width="100%">
            <tr>
                <?php
                for($i = 0;$i < 3;$i++){
                    echo "<td align=\"center\"><img src=\"";
                    echo $pictures[$i];
                    echo "\"/></td>";
                }
                ?>
            </tr>
        </table>
    </div>
</body>
</html>

这是文件目录:

效果展示:

    使用array_reserve()函数:使用一个数组作参数,返回一个内容与参数数组相同但顺序相反的数组。例如,可以用很多方法创建一个按逆序包含数字10到1的数组。

                第一种:单独使用range()函数创建一个升序的数组,再用rsort()函数或者array_reserve()函数将数组中的数字变为降序;

                第二种:使用for循环通过一次一个元素的方式创建这个数组,

$numbers = array();
for($i = 10;$i > 0;$i--){
    $numbers[] = $i;
}
print_r($numbers);

示例结果:

注意:可以使用array_push()函数,像这样:

$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");
print_r($stack);

示例结果: