技术开发 频道

PHP 开发经典教程 (Part 4):数组

一个大的错误 

    花费大量时间浏览PHP的外部风景(学习了所有关于PHP的控制结构、操作符和变量的内容),对此,你可能已经厌烦了。你也许甚至考虑立即退出该教程,然后更愿意(大约你会这么认为)把时间花费在电视机前。 

    如果这样,那将会是一个大的错误。而当我说“大”的时候,我的意思是指巨大。 

    你看,如果你因为Ally McBeal的魅力而放弃该教程本章节内容的学习,那么你将会错失接触PHP最酷的变量类型之一的机会。它就是被称为“数组(array)”的一个小玩意,而且我毫不夸张的说,当我告诉你一旦你适应它的用法,你将对PHP脚本另眼相看。但是,不要把我的话当作……,把那些仍到一边,自己亲自试试看!
水果比萨 

    截至目前,我们所讨论的变量只包含一个值,就像下面代码所示的一样:

<?php $i = 5; ?>

 

    然而,数组变量是完全不同的状况。数组是一种复杂的变量类型,其允许你在单一变量中存储多个值(当你需要存储和描述相关信息的时候,它可以很容易地做到)。我们可以把数组变量当作可以容纳一个或多个值的“容器”变量。例如:

<?php // define an array $pizzaToppings = array('onion', 'tomato', 'cheese', 'anchovies', 'ham', 'pepperoni'); print_r($pizzaToppings); ?>

 

    这里,$pizzaToppings是一个数组变量,其包含‘onion’、‘tomato’、‘cheese’、‘anchovies’、‘ham’和‘pepperoni’这些值(数组变量对于相关值进行分组尤其有用)。 

    Print_r()是一个特殊的函数,其允许你窥见数组变量里面的值。和用于显示数组内容的目的比较而言,它对于程序调试(找出脚本失效的原因)更有用,但我将在这里使用它以使你可以理解表面之下所正在发生的。确保让你的服务器运行和浏览器打开,好吗? 

    数组里面不同的元素通过索引值来访问,且其第一个元素的索引值从0开始。因此,为了访问元素‘onion’,你将使用符号$pizzaToppings[0],而‘anchovies'将是$pizzaToppings[3](本质上是数组变量名称紧跟着被中括号所包含的索引值)。 

    PHP也允许你用用户自定义的“关键字”来代替索引,这是为了创建一种稍微不同类型的数组。其中,每个关键字都是唯一的,并且对应于数组中的一个单一值。

<?php // define an array $fruits = array('red' => 'apple', 'yellow' => 'banana', 'purple' =>
'plum', 'green' => 'grape'); print_r($fruits); ?>


    在该实例中,$fruits是一个包含四个关键字值对的数组变量。(=>符号用于指示关键字和其对应的值之间的关联关系)。为了访问‘banana’值,你要使用$fruits[‘yellow']符号,而‘grape’值通过符号$fruits[‘green']来访问。 

    该种类型的数组有时被称为“散列数组”或“关联数组”。如果你曾经使用过Perl语言,那么你将会看到它类似于Perl语言中的散列变量。

意大利菜 

    定义数组变量最简单的方法就是使用array()函数,下面演示了其用法:

<?php // define an array $pasta = array('spaghetti', 'penne', 'macaroni'); ?>

     选择数组变量的名称的规则和选择其他PHP变量的名称的规则是一样的:变量名称必须以字母或者下划线开始,后面可以任意跟随多个字母、数字和下划线。 

    另外,你可以通过指定用于索引符号中的每一个元素的值来定义一数组,如下所示:

<?php // define an array $pasta[0] = 'spaghetti'; $pasta[1] = 'penne'; $pasta[2] = 'macaroni'; ?>

    如果你更喜欢使用关键字而不是缺省数值索引来访问数组元素,那么你或许会更喜欢下面的列子:

<?php // define an array $menu['breakfast'] = 'bacon and eggs'; $menu['lunch'] = 'roast beef'; $menu['dinner'] = 'lasagna'; ?>

 

    你可以采用类似的方法来给数组增加元素。举例而言,如果你想添加元素‘green olives’到$pizzaToppings数组中,那么你将会使用下列所示的方法:

<?php // add an element to an array $pizzaToppings[3] = 'green olives'; ?>

 

    为了修改数组的某个元素,只需要简单的将一个新值附给对应的标量变量即可。如果你想用‘chicken’值来替换‘ham’,那么你可以使用下面的方法:

<?php // modify an array $pizzaToppings[4] = 'chicken'; ?>

 

    你可以使用关键字来做同样的事情。下列语句将关键字‘lunch’所对应的的数组元素值修改为一个不同的值:

<?php // modify an array $menu['lunch'] = 'steak with mashed potatoes'; ?>

 

 

推进和拉出 

    你也可以使用array_push()函数在现有的数组末位增加元素:

<?php // define an array $pasta = array('spaghetti', 'penne', 'macaroni'); // add an element to the end array_push($pasta, 'tagliatelle'); print_r($pasta); ?>


     同时,你可以使用名字非常有趣的array_pop()函数从数组末端移除元素。

<?php // define an array $pasta = array('spaghetti', 'penne', 'macaroni'); // remove an element from the end array_pop($pasta); print_r($pasta); ?>

 

     如果你需要从数组顶部取元素,那么你可以使用array_shift()函数:

<?php // define an array $pasta = array('spaghetti', 'penne', 'macaroni'); // take an element off the top array_shift($pasta); print_r($pasta); ?>

 

     且array_unshift()函数负责增加元素到数组的起始端。

<?php // define an array $pasta = array('spaghetti', 'penne', 'macaroni'); // add an element to the beginning array_unshift($pasta, 'tagliatelle'); print_r($pasta); ?>

 

    array_push()和array_unshift()函数对与其等相关联的数组并不起作用;为了对该等数组添加元素,最好采用$arr[$key] = $value符号为数组增加新值。 

    explode()函数根据用户指定的分隔符将字符串分解为更小的单元,然后将分解得到的单元以数组的形式返回。

<?php // define CSV string $str = 'red, blue, green, yellow'; // split into individual words $colors = explode(', ', $str); print_r($colors); ?>

 

    为了执行和上面相反的过程,你可以使用implode()函数,该函数通过使用用户定义的分隔符将数组中的所有元素连接在一起而创建一个字符串。将上述例子颠倒过来,我们可以得到下面的代码:

<?php // define array $colors = array ('red', 'blue', 'green', 'yellow'); // join into single string with 'and' // returns 'red and blue and green and yellow' $str = implode(' and ', $colors); print $str; ?>

 

    最后,下面的两个例子展示了如何使用sort()和rsort()函数分别以升序和降序的方式对数组按字母(或数值)顺序来进行排序:

<?php // define an array $pasta = array('spaghetti', 'penne', 'macaroni'); // returns the array sorted alphabetically sort($pasta); print_r($pasta); print "<br />"; // returns the array sorted alphabetically in reverse rsort($pasta); print_r($pasta); ?>

循环 

    因要负责将数据放置在数组内,现在,如何将其取出呢? 

    从数组中检索数据非常简单:所有你所需要做的就是使用索引号来访问数组的适当元素。为了读取整个数组的内容,你只需要使用你在该教程第三章中所学到的循环结构来简单的对其进行循环操作即可。 

    来一个快捷的例子如何?

<html> <head></head> <body> My favourite bands are: <ul> <?php // define array $artists = array('Metallica', 'Evanescence', 'Linkin Park', 'Guns n Roses'); // loop over it and print array elements for ($x = 0; $x < sizeof($artists); $x++) { echo '<li>'.$artists[$x]; } ?> </ul> </body> </html>


    当你运行该脚本时,你会看到下面的结果:

My favourite bands are: Metallica Evanescence Linkin Park Guns n Roses

 

    在这个实例中,我首先定义了一个数组,然后使用for()循环做下面的工作:遍历该数组,使用索引符号取得元素,然后一个接一个的显示它们。 

    在这里,我将吸引你们的注意力在sizeof()函数上。该函数是最重要也是最常用的数组函数之一。其返回数组的大小(读取:数组内元素的个数)。它大部分用于循环计数器中以确保循环次数和数组中的所有元素的个数一致。 

    如果你正在使用联合数组,那么随手可得array_keys()和array_values()函数以用来得到数组中所有关键字和对应的值的列表。

<?php // define an array $menu = array('breakfast' => 'bacon and eggs', 'lunch' => 'roast beef', 'dinner' => 'lasagna'); /* returns the array ('breakfast', 'lunch', 'dinner') with numeric indices */ $result = array_keys($menu); print_r($result); print "<br />"; /* returns the array ('bacon and eggs', 'roast beef', 'lasagna') with numeric indices */ $result = array_values($menu); print_r($result); ?>

 

    然而,这里还有一种更简单的方法来提取数组中的所有元素。PHP4.0介绍了一种经设计专门用于对数组反复枚举目的的非常新的循环类型:foreach()循环(它的语法结构类似于同名的Perl结构)。 

    下面是其语法格式:

foreach ($array as $temp) { do this! }


 

     foreach()循环对作为参数传递给它的数组的每一个元素运行一次,在每次重复时向前遍历该数组。和for()循环不同,它不需要计数器或调用函数sizeof(),因为它自动跟踪其在数组中的位置。在每次运行的时候,执行大括号内的语句,同时,当前选择的数组元素可以通过一个临时的循环变量来访问。 

    为了更好的理解它是如何工作的,考虑使用foreach()循环对之前的例子进行重新改写:

<html> <head></head> <body> My favourite bands are: <ul> <?php // define array $artists = array('Metallica', 'Evanescence', 'Linkin Park', 'Guns n Roses'); // loop over it // print array elements foreach ($artists as $a) { echo '<li>'.$a; } ?> </ul> </body> </html>


    每次执行循环时,它将当前选择的数组元素的值放在临时变量$a中。之后,该变量可以被循环块中的语句进行使用。因为foreach()循环不需要计数器跟踪其在数组中的位置,所以它需要更少的维护且同时比标准的for()循环更加易读。奥,是的…,它同样也可与关联数组一起起作用,而不需要额外的编程。

大众音乐 

    除了它们那些显而易见的用法之外,数组和循环也是PHP中处理表单的自然而然的方法。例如,如果你具有一组相关的选择框或者多选列表,那么你可以使用一数组以单一变量的形式来获得所有选择的表单值以简化处理。考虑下面的这个例子,它示范了这种用法:

<html> <head></head> <body> <?php // check for submit if (!isset($_POST['submit'])) { // and display form ?> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> <input type="checkbox" name="artist[]" value="Bon Jovi">Bon Jovi <input type="checkbox" name="artist[]" value="N'Sync">N'Sync <input type="checkbox" name="artist[]" value="Boyzone">Boyzone <input type="checkbox" name="artist[]" value="Britney Spears">Britney Spears <input type="checkbox" name="artist[]" value="Jethro Tull">Jethro Tull <input type="checkbox" name="artist[]" value="Crosby, Stills & Nash">Crosby, Stills & Nash <input type="submit" name="submit" value="Select"> </form> <?php } else { // or display the selected artists // use a foreach loop to read and display array elements if (is_array($_POST['artist'])) { echo 'You selected: <br />'; foreach ($_POST['artist'] as $a) { echo "<i>$a</i><br />"; } } else { echo 'Nothing selected'; } } ?> </body> </html>


    当提交上述表单时,PHP将会自动创建一个数组变量,然后用所选择的内容填充进去。之后这个数组就可以采用foreach()循环来处理,然后从中获得所选择的条目。 

    你也可以使用多选列表来完成上述任务,只要对选择控制的“名字”属性使用数组符号。

    你自己可以试试然后看看…..,确定你在同一时间,同样的频道收听下次的PHP101教程。

0
相关文章