从零开始攻略PHP(4)——数组的使用

1.数组的概念

  数组就是一个用来存储一系列变量值的命名区域。

  每个数组元素有一个相关的索引(也成为关键字),它可以用来访问元素。

  PHP允许间隔性地使用数字或字符串作为数组的索引。

2.数字索引数组

  2.1 数字索引数组的初始化

$products = array(‘Tires’,’Oil’,’Spark Plugs’);

  如果需要将按升序排列的数字保存在一个数组中,可以使用range()函数自动创建这个数组。

  创建一个1-10的数字数组:

$numbers = range(1,10);

  可选的第三个参数允许设定值之间的步幅。

  创建一个1-10之间的奇数数组:

$odds = range(1,10,2);

  2.2 访问数组的内容

  默认情况下,0元素是数组的第一个元素,使用$products[0]、$products[1]、$products[2],就可以使用数组$products的内容了。

  除了访问,数组的内容可以修改和添加:

$products[3] = ‘Fuses’;

  像PHP的其他变量一样,数组不需要预先初始化或创建。在第一次使用它们的时候,它们会自动创建。

  如下代码创建了一个与前面使用array()语句创建的$products数组相同的数组:

$products[0] = ‘Tires’;

$products[1] = ‘Oil’;

$products[2] = ‘Spark Plugs’;

  数组的大小将根据所增加的元素多少动态地变化。

  2.3 使用循环访问数组

  就是遍历数组:

foreach($products as $current){

    echo $current.” “;

}

  以上代码将依次保存$current变量中的每一个元素并且打印它们。

3.使用不同索引的数组

  在上面的$products数组中,允许PHP为每个元素指定一个默认的索引。这就意味着,所添加的第一个元素为元素0,第二个元素为1等。PHP还支持关联数组。

  3.1 初始化关联数组

  如下所示的代码可以创建一个以产品名称为关键字、以价格作为值的关联数组:

$prices = array(‘Tires’=>100,’Oil’=>10,’Spark Plugs’=>4);

  3.2 使用循环语句

  因为关联数组的索引不是数字,因此无法使用for循环语句对数组进行操作。但是可以使用foreach循环或list()和each()结构。

  当使用foreach循环语句对关联数组进行操作时,可以按如下方式使用关键字:

foreach($prices as $key => $value){

    echo $key.” - ”.$value.”<br />”;

}

  如下所示的代码将使用each()结构打印$prices数组的内容。

while($element = each($prices)){

    echo $element[‘key’];

    echo “ - ”;

    echo $element[‘value’];

    echo “<br />”;

}

  在这段代码中,变量$element是一个数组。当调用each()时,它将返回一个带有4个数值和4个指向数组位置的索引的数组。位置key和0包含了当前元素的关键字,而位置value和1包含了当前元素的值。

  除了以上两种方式,函数list()可以用来将一个数组分解为一系列的值。

while(list($product,$price) = each($prices)){

    echo “$product - $price<br />”;

}

  这个看起来挺高大上,使用each()从$prices数组中取出当前元素,并且将它作为数组返回,然后再指向下一个元素。还使用list()将从each()返回的数组中所包含0、1两个元素变为两个名为$product和$price的新变量。

  三种输出方式的结果相同:

  注意,当使用each()函数时,数组将记录当前元素。如果希望在相同的脚本中两次使用该数组,就必须使用函数reset()将当前元素重新设置到数组开始处。要再次遍历该数组,可以使用以下代码:

reset($prices);

while( list( $product, $price ) = each( $prices ))

echo “$product - $price<br />”;

  以上代码可以将当前元素重新设置到数组开始处,因此允许再次遍历数组。

4.数组操作符

  其中联合操作符(+)尝试将$b中的元素添加到$a的末尾。如果$b中的元素与$a中的一些元素具有相同的索引,它们将不会被添加。即$a中的元素将不会被覆盖。

5.多维数组

  5.1 二维数组

$products = array( array( ‘TIR’, ‘Tires’, 100 ),

array( ‘OIL’, ‘Oil’, 10 ),

array( ‘SPK’, ‘Spark Plugs’, 4 ));

  可以使用双重for循环来访问每个元素:

for($row = 0; $row < 3; $row++){

    for($column = 0; $column < 3; $column++){

        echo ‘|’.$products[$row][$column];

    }

    echo ‘|<br />’;

} 

  可以使用列名称来代替数字。要保存产品的相同集合,可以使用如下代码:

$products = array( array( ‘Code’=>’TIR’,

        ‘Description’=>’Tires’,

        ‘Price’=>100

    ),

    array( ‘Code’=> ‘OIL’,

        ‘Description’=>’Oil’,

        ‘Price’=>10

    ),

    array(‘Code’=>’SPK’,

        ‘Decription’=>’Spark Plugs’,

        ‘Price’=>4

    )

 );            

  如果希望检索单个值,那么使用这个数组会容易得多。 使用描述性索引,不需要记住某个元素是存放在[x][y]位置的。使用一对有意义的行和列的名称作为索引可以使你很容易找到所需的数据。

  描述性索引的遍历:

for( $row = 0; $row < 3; $row++ ){

    while( list( $key, $value ) =each( $products[$row] ) ){

        echo “|$value”;

    }

    echo ‘|<br />’;

}

  5.2 三维数组

  三维数组是一个包含了数组的数组的数组。

$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‘,‘Oil‘,15),

        array(‘TRK_SPK‘,‘Spark Plugs‘,6)

    )

);            

  遍历:

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 />‘;

    }

}

  根据创建多维数组的方法,可以创建四维、五维或六维数组。感兴趣可以试下。

6.数组排序

  6.1 使用sort()函数

  sort()函数可以将数组按字母升序进行排序:

$products = array(‘LiLei‘,‘HanMeimei‘,‘Wo‘);

    sort($products);

    foreach ($products as $key) {

    echo $key." ";

}

  还可以按数字顺序进行排序。需要注意的是,sort()函数是区分大小写的。所有大写字母都在小写字母前面。

  第二个参数可选,可指定排序类型:SORT_REGULAR(默认值)、SORT_NUMERIC或SORT_STRING。

  6.2 使用asort()函数和ksort()函数对关联数组排序

  如果用关联数组存储各个项目和它们的价格,就需要用不同的排序函数使关键字和值在排序时仍然保持一致。

  如下创建一个包含3个产品和价格的数组:

$prices = array(‘Tires‘=>100,‘Oil‘=>10,‘Spark Plugs‘=>4);

  函数asort()根据数组的每个元素值进行排序:

asort($prices);

while(list($product,$price) = each($prices)){

    echo "$product - $price<br />";

}

  而函数ksort()则是根据数组的每个关键字进行排序:

ksort($prices);

while(list($product,$price) = each($prices)){

    echo "$product - $price<br />";

}

  6.3 反向排序

  即降序排序,与sort()、asort()、ksort()分别对应的是rsort()、arsort()、krsort()。

7.多维数组的排序

  7.1 用户定义排序

$products = array(

    array( ‘TIR‘, ‘Tires‘, 100 ),

    array( ‘OIL‘, ‘Oil‘, 10 ),

    array( ‘SPK‘, ‘Spark Plugs‘, 4 )

);

  自定义排序需要用函数usort()告诉PHP如何比较各个元素。为此需要编写自己的比较函数。

  如下所示对订单数组中的第二列按字母进行排序:

function compare($x, $y){

    if($x[1] == $y[1]){

        return 0;

    }

    else if($x[1] < $y[1]){

        return -1;

    }

    else{

        return 1;

    }

}

usort($products,‘compare‘);

for($row = 0; $row < 3; $row++){

    for($column = 0; $column < 3; $column++){

        echo ‘|‘.$products[$row][$column];

    }

    echo ‘|<br />‘;

}    

  为了能够被usort()函数使用,compare()函数必须比较$x和$y。如果$x等于$y,该函数必须返回0,如果$x小于$y,该函数必须返回负数,大于则返回正数。最后一句调用了内置函数usort(),该函数使用的参数分别是希望保存的数组($products)和比较函数的名称(compare())。

  如果要让数组按另一种顺序存储,只要编写一个不同的比较函数。

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

  7.2 反向用户排序

  用户定义的排序没有反向变体,但可以对一个多维数组进行反向排序。由于用户应该提供比较函数,因此可以编写一个能够返回相反值的比较函数:

function reverse_compare($x, $y){

  if($x[2] == $y[2]){

    return 0;

  }

  else if($x[1] < $y[1]){

    return 1;

  }

  else{

    return -1;

  }

}

8.对数组进行重新排序

  shuffle()函数:将数组各元素进行随机排序。

  array_reverse()函数:给出一个原来数组的反向排序。

9.从文件载入数组

  当前的订单文件:

<?php
//create short variable name
$DOCUMENT_ROOT = $_SERVER[‘DOCUMENT_ROOT‘];

$orders= file("$DOCUMENT_ROOT/orders.txt");

$number_of_orders = count($orders);
if ($number_of_orders == 0) {
  echo "<p><strong>No orders pending.
       Please try again later.</strong></p>";
}

for ($i=0; $i<$number_of_orders; $i++) {
  echo $orders[$i]."<br />";
}
?>

  还可以将订单中的每个区段载入到单独的数组元素中,从而可以分开处理每个区段或将它们更好地格式化。

  用PHP分离、格式化显示订单内容:

<?php
  //create short variable name
  $DOCUMENT_ROOT = $_SERVER[‘DOCUMENT_ROOT‘];
?>
<html>
<head>
  <title>Bob‘s Auto Parts - Customer Orders</title>
</head>
<body>
<h1>Bob‘s Auto Parts</h1>
<h2>Customer Orders</h2>
<?php
  //Read in the entire file.
  //Each order becomes an element in the array
  $orders= file("$DOCUMENT_ROOT/orders.txt");

  // count the number of orders in the array
  $number_of_orders = count($orders);

  if ($number_of_orders == 0) {
    echo "<p><strong>No orders pending.
          Please try again later.</strong></p>";
  }

  echo "<table border=\"1\">\n";
  echo "<tr><th bgcolor=\"#CCCCFF\">Order Date</th>
            <th bgcolor=\"#CCCCFF\">Tires</th>
            <th bgcolor=\"#CCCCFF\">Oil</th>
            <th bgcolor=\"#CCCCFF\">Spark Plugs</th>
            <th bgcolor=\"#CCCCFF\">Total</th>
            <th bgcolor=\"#CCCCFF\">Address</th>
         <tr>";

  for ($i=0; $i<$number_of_orders; $i++) {
    //split up each line
    $line = explode("\t", $orders[$i]);

    // keep only the number of items ordered
    $line[1] = intval($line[1]);
    $line[2] = intval($line[2]);
    $line[3] = intval($line[3]);

    // output each order
    echo "<tr>
             <td>".$line[0]."</td>
             <td align=\"right\">".$line[1]."</td>
             <td align=\"right\">".$line[2]."</td>
             <td align=\"right\">".$line[3]."</td>
             <td align=\"right\">".$line[4]."</td>
             <td>".$line[5]."</td>
          </tr>";
  }

  echo "</table>";
?>
</body>
</html>

  这里使用了explode()函数来分隔每行,这样在开始打印前就可以再做一些处理与格式化。在上一篇中,保存数据的时候使用了制表符作为定界符,因此,将按如下方式调用:

explode(“\t”,$orders[$i]);

  可以使用许多方法从字符串中提取数字。这里使用了intval()函数,可以将一个字符串转化成一个整数。

10.执行其他数组操作

  10.1 在数组中浏览:each()、current()、reset()、end()、next()、pos()和prev()

  如果创建一个新数组,那么当前指针就将被初始化,并指向数组的第一个元素。

  调用current($array_name)将返回第一个元素。

  调用next()或each()将使指针前移一个元素。其中调用each($array_name)会在指针前移一个位置之前返回当前元素。而调用next($array_name)先将指针前移,然后再返回新的当前元素。

  reset()函数将返回指向数组第一个元素的指针。

  end()函数将返回指向数组最后一个元素的指针。

  prec()函数将当前指针回移一个位置然后再返回新的当前元素。可使用end()和prev()进行反向遍历:

$array = array(7,8,9);

$value = end($array);

while($value){

  echo "$value<br />";

  $value = prev($array);

}

  10.2 对数组的每一个元素应用任何函数:array_walk()

  array_walk()函数可以以相同方式使用或者修改数组中的每一个元素。

bool array_walk(array arr,string func,[mixed userdata])

  array_walk()的第一个参数是需要处理的数组,第二个参数是用户自定义并且将作用于数组中每个元素的函数。

  第三个参数可以作为一个参数传递给自己的函数,可选。

  10.3 统计数组元素的个数:count()、sizeof()和array_count_values()

  count()函数和sizeof()函数都可以返回数组元素的个数。

  调用array_count_values($array)将会统计每个特定的值在数组$array中出现过的次数(数组的基数集)。这个函数将返回一个包含频率表的关联数组。该数组包括关键字以及对应的出现次数。

10.4 将数组转换成标量变量:extract()

  函数extract()的作用是通过一个数组创建一系列的标量变量,这些变量的名称必须是数组中关键字的名称,而变量值则是数组中的值。

  extract()函数具有两个可选参数:extract_type和prefix。变量extract_type将告诉extract()函数将如何处理冲突。

  两个最常用的选项是EXTR_OVERWRITE(默认)和EXTR_PREFIX_ALL。

$array = array(‘key1‘=>‘value1‘,‘key2‘=>‘value2‘,‘key3‘=>‘value3‘);

extract($array,EXTR_PREFIX_ALL,‘my_prefix‘);

echo "$my_prefix_key1 $my_prefix_key2 $my_prefix_key3";

  可能你已经注意到了,extract()的关键字必须是一个有效的变量名称才行,以数字开始或包含空格的关键字将被跳过。

  整理自《PHP与MySQL Web开发》

时间: 2024-11-02 12:17:52

从零开始攻略PHP(4)——数组的使用的相关文章

从零开始攻略PHP(5)——字符串操作与POSIX正则

一.字符串操作 1.字符串的格式化 1.1 干掉空格 trim()函数可以除去字符串开始位置和结束位置的空格,并将结果字符串返回. ltrim()函数可以除去字符串开始位置的空格. rtrim()函数可以除去字符串结束位置的空格. 1.2 格式化字符串以便显示 nl2br()函数将字符串作为输入参数,用HTML中的<br />标记代替字符串中的换行符. printf()函数将一个格式化的字符串输出到浏览器中. sprintf()函数返回一个格式化了的字符串. 当在类型转换代码中使用printf

从零开始攻略PHP(6)——代码重用与函数编写的一些注意事项

一个新的项目是这样创建的:它将已有的可重新利用的组件进行组合,并将新的开发难度降低到最小. 代码重用的好处:降低成本.提升可靠性和一致性. 1.使用require()和include()函数 使用一条require()或include()语句,可以将一个文件载入到PHP脚本中. require()和include()几乎相同.区别是函数失败后,require()函数将给出一个报错.Include()给的则是警告. 变体函数分别是require_once()和include_once().作用是确

从零开始攻略PHP(7)——面向对象(上)

1.理解面向对象的概念 面向对象软件的一个重要优点是支持和鼓励封装的能力.封装也叫数据隐藏. 在面向对象的软件中,对象是一个被保存数据和操作这些数据的操作方法的唯一.可标识的集合. 对象可以按类进行分类. 面向对象的编程语言必须支持多态性,多态性的意思是指不同的类对同一操作可以有不同的行为.语言支持多态性,可以知道将哪个操作应用于一个特定的对象. 多态性与其说是对象的特性,不如说是行为的特性.在PHP中,只有类的成员函数可以是多态的. 例如,尽管自行车的“移动”和汽车的“移动”在概念上是相似的,

Java数组技巧攻略

  Java数组技巧攻略 0.  声明一个数组(Declare an array) [js] view plaincopyprint? String[] aArray = new String[5]; String[] bArray = {"a","b","c", "d", "e"}; String[] cArray = new String[]{"a","b",&q

webBrowser中操作网页元素全攻略

webBrowser中操作网页元素全攻略 2012-12-20 14:21 188人阅读 评论(0) 收藏 举报 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBrowser1.Document.GetElementById("控件ID").InnerText; 或webBrowser1.Document.GetElementById("控件ID").GetAttr

redis大型攻略!

redis大型攻略 一:redis的简介.下载和安装 二:redis主从 三:redis在线升级 四:redis多实例 五:redis常见的操作 六:reids配置详解 实验环境:CentOS-6.5-x86_64   redis-2.8.9.tar.gz 一:redis的简介.下载和安装 Redis是一个key-valu存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集

Windows Socket五种I/O模型——代码全攻略(转)

Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模式.可以通过多线程技术进行处理. 非阻塞模式:执行I/O操作时,Winsock函数会返回并交出控制权.这种模式使用 起来比较复杂,因为函数在没有运行完成就进行返回,会不断地返回 WSAEWOULDBLOCK错误.但功能强大.为了解决这个问题,提出了进行I/O操作的一些I/O模型,下面介绍最常见的三种: Windows Socket五种I/O模型——代码全攻

程序员技术练级攻略

以下全文来自http://coolshell.cn/articles/4990.html 前言 你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,不如从工作中的需求出发) 建议: 不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少10年通用. 回顾一下历史,看看历史上时间线上技术的发展,你才能明白明天会是什么样. 一定要动手,例子不管多么简

前台页面优化全攻略(三)

经过前两篇文章的实践,你的网站加载速度一定有了非常明显的变化.能把实践跟到这篇文章的人想必一定是极客中的极客.如果你仍对网站的加载速度不满意,可以看看再尝试一下本文中几近疯狂的终极优化方案. 你可以对网站进行快速的优化,但网站日常的节食却很难.也许你已经花了很大的力气去优化你的CSS和JavaScript代码,但是你所做的努力马上又会因为老板或客户期望的新功能而付之东流.所以看来不论是人还是网页,减肥都贵在坚持. 这篇终极减肥方案可能不适合所有的网站,但是我相信它可以引起你对网页大小的重视. 1