PHP中的数组与数据结构


PHP中的数组与数据结构 网址:www.lampbrother.net 电话:400 700 1307 PHP中的数组与数据结构 1. 数组的概述 2. 数组的定义 3. 数组的遍历 4. 预定义数组 5. 数组的相关处理函数 一、数组的概述 PHP 中的数组实际上是一个有序图。图是一 种把 values 映射到 keys 的类型。此类型在很 多方面做了优化,因此可以把它当成真正的数组 来使用,或列表(矢量),散列表(是图的一种 实现),字典,集合,栈,队列以及更多可能性 。因为可以用另一个 PHP 数组作为值,也可以很 容易地模拟树。 ™ 所谓的数组下标可以视为资料内容在此数组中的识别名称,通 常被称为数组下标。 ™ 当索引值为数值时,也代表此资料内容在数组中的储存位置。 ™ 数组中有几个索引值就被称为几维数组。 ™ 数组分类: ¾ 在PHP中有两种数组:索引数组和关联数组。 „ 索引(indexed)数组的索引值是整数,以0开始。当通 过位置来标识东西时用索引数组。 „ 关联(associative)数组以字符串做为索引值,关联数 组更像操作表。索引值为列名,用于访问列的数据。 二、数组的定义 ™ 2.1 直接赋值的方式声明数组 ™ 2.2 使用array( )语言结构新建数组 ™ 2.3 多维数组的声明 ™ 数组常用的赋值方式: 由于 PHP 是属于弱类型数据,因此源代码中的数组并不 需要经过特别的声明操作,直接将一组数值指定给某一数 组元素即可。一般情况下数组的赋值有两种方式: ¾ 直接赋值方式 如: „ $a[0]=‘spam@126.com’; „ $a[1]=‘abuse@sohu.com’; ¾ 使用array函数 如: „ $a=array(“spam@126.com “,”abuse@sohu.com”); 2.1 直接赋值的方式声明数组 ™ 直接赋值格式: $数组变量名[索引值]=资料内容 其中索引值(下标)可以是一个字符串或一个整数。 等价于整数(不以0开头)的字符串值被当作整数对待。 因此,数组$array[3]与$array[‘3’]是引用相同的元素。 但是$array[‘03’]引用的另外不同的元素。 ™ 一维数组 数组中索引值(下标)只有一个的数组称为一维数组。 在数组中这是最简单的,也是最常用的了。 实例1: 实例2: 2.2 使用array( )语言结构新建数组 ™ 格式: array( [key =>] value , ... ) // key 可以是 integer 或者 string // value 可以是任何值 ™ key 可以是 integer 或者 string。如果键名是一个 integer 的标 准表达方法,则被解释为整数(例如 “8” 将被解释为 8,而 “08” 将被解释为 “08”)。key 中的浮点数被取整为 integer。 PHP 中没有不同的数字下标和关联下标数组,数组的类型只有一种, 它可以同时包含整型和字符串型的下标。 ™ 如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的 键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。 ™ 实例: "aaa",1=>"bbb",2=>"ccc"); $d=array("aaa",6=>"bbb","ccc"); $e=array("name"=>"zhang", "age"=>20); ?> 2.3 多维数组的声明 ™ 二维数组的声明 ™ 多维数组的声明方式及规则,与一维数组相同,例如: 下面二维数组的声明片段: ™ 这时数组中的资料内容如下: ™ 如果以 array 语法声明,则如下程序片段: ™ 三、数组的遍历 ™ 3.1 使用for语句循环遍历数组 ™ 3.2 使用foreach语句遍历数组 ™ 3.3 联合使用list( )、each( )和while循 环遍历数组 ™ 3.4 使用数组的内部指针控制函数遍历数 组 3.1 使用for语句循环遍历数组 4, 5, 6, 7, 8,9,10=>"aa", "bb", "cc"); for($i=0; $i"; } ?> 3.2 使用foreach语句遍历数组 ™ foreach循环结构: ¾ foreach 仅用于数组,有两种语法。 foreach (array_expression as $value) …..statement foreach (array_expression as $key => $value) …..statement 第一种格式遍历给定的 array_expression 数组。每 次循环中,当前单元的值被赋给 $value 并且数组内部的 指针向前移一步 ™ 第二种格式做同样的事,只除了当前单元的键值也会 在每次循环中被赋给变量 $key。 注: 当 foreach 开始执行时,数组内部的指针会自 动指向第一个单元。此外注意foreach 所操作的是指 定数组的一个拷贝,而不是该数组本身。 $v) { echo "$k => $v
"; } ?> 3.3 联合使用list( )、each( )和while循环遍历数组 ™ array each ( array array) 返回 array 数组中当前指针位置的键/值对并向前移动数组指针 。键值对被返回为四个单元的数组,键名为 0,1,key 和 value。 单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据。 如果内部指针越过了数组的末端,则 each() 返回 FALSE。 each() 经常和list( ) 结合使用来遍历数组。 ™ void list ( mixed ...) ¾ 它不是真正的函数,而是语言结构。list() 用一步操作给一组变 量进行赋值。 注: list() 仅能用于数字索引的数组并假定数字索引从0开始。 ¾ 在执行 each() 之后,数组指针将停留在数组中的下一个单元或 者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍 历数组,必须使用reset( )。 'apple', 'b' => 'banana', 'c' => 'cranberry'); reset($fruit); while (list($key, $val) = each($fruit)) { echo "$key => $val\n"; } $arr=array("one"=>"aaa", "two"=>"bbb", "three"=>"cccc"); while($sz=each($arr)){ //echo $sz[0]."===>".$sz[1]."
"; echo $sz["key"]."===>".$sz["value"]."
"; } ?> 3.4 使用数组的内部指针控制函数遍历数组 ™ 数组指针的控制函数 由于数组是由多笔资料集合而成,所以当程序需要运算处理其中 某个索引位置的资料内容时,会由数组之中内定的指针,指向目标资 料,以提供程序作正确的读取。下面针对数组指针控制的相关函数, 作简单的说明介绍: ™ next()、prev()、end()及 reset() 这四个函数可以控制目前数组中的指针位置。next()负责将指针 向后移动,prev()负责将指针向前移动;end()会将指针指向数组中 最后一个元素,而 reset()函数则会将目前指针无条件移至第一个索 引位置。 ™ 语法格式: mixed next(数组名称); mixed prev(数组名称); mixed end(数组名称); mixed reset(数组名称); 四、 预定义数组 ™ 4.1 服务器变量: $_SERVER ™ 4.2 环境变量:$_ENV ™ 4.3 HTTP GET变量:$_GET ™ 4.4 HHTP POST变量:$_POST ™ 4.5 request变量:$_REQUEST ™ 4.6 HTTP文件上传变量:$_FILES ™ 4.7 HTTP Cookies:$_COOKIE ™ 4.8 Session变量:$_SESSION ™ 4.9 Global变量:$_GLOBALS 4.1 服务器变量: $_SERVER ™ $_SERVER 是一个包含诸如头信息(header)、路径( path)和脚本位置(script locations)的数组。数组的 实体由 web 服务器创建。不能保证所有的服务器都能产 生所有的信息;服务器可能忽略了一些信息,或者产生了 一些未在下面列出的新的信息。这是一个自动全局变量。 这只不过意味这它在所有的脚本中都有效。在函数或方法 中不需要使用 global $_SERVER; ¾ PHP_SELF :当前正在执行脚本的文件名 ¾ DOCUMENT_ROOT :当前运行脚本所在的文档根目录 ¾ REMOTE_ADDR :正在浏览当前页面用户的 IP 地址。 4.2 环境变量:$_ENV ™ 在解析器运行时,这些变量从环境变量转变为 PHP 全局变量名称空间(namespace)。它们中的 许多都是由 PHP 所运行的系统决定。完整的列表 是不可能的。请查看系统的文档以确定其特定的 环境变量。 ™ 这是一个自动全局变量。它在所有的脚本中都有 效。在函数或方法中不需要使用 global $_ENV; 4.3 HTTP GET变量:$_GET ™ 通过 HTTP GET 方法传递的变量组成的数组。是自 动全局变量. ™ http://localhost/login.php?name=zhangsan&id=100 ™ 4.4 HHTP POST变量:$_POST ™ 通过 HTTP POST 方法传递的变量组成的数 组。是自动全局变量。 ™ 与$_GET相似,只是方法不一样。 4.5 request变量:$_REQUEST ™ 此关联数组包含 $_GET,$_POST 和 $_COOKIE 中的全部内容。 4.6 HTTP文件上传变量:$_FILES ™ 通过 HTTP POST 方法传递的已上传文件项 目组成的数组。是自动全局变量。 4.7 HTTP Cookies:$_COOKIE 4.8 Session变量:$_SESSION 4.9 Global变量:$_GLOBALS 五、数组的相关处理函数 ™ 5.1 数组的键/值操作函数 ™ 5.2 统计数组元素的个数与唯一性 ™ 5.3 使用回调函数处理数组的函数 ™ 5.4 数组的排序函数 ™ 5.5 拆分、合并、分解与结合数组 ™ 5.6 数组与数据结构 ™ 5.7 其他有用的数组处理函数 5.1 数组的键/值操作函数 ™ array_values -- 返回数组中所有的值 ¾ 格式:array array_values ( array input ) $a = array("name"=>"张三","age"=>20,"sex"=>"男"); $values = array_values($a); var_dump($values); //array(3){[0]=>string(4)"张三" [1]=>int(20) [2]=>string(2)"男"} ™ array_keys -- 返回数组中所有的键名 ¾ 格式:array array_keys(array input[,mixed search_value [,bool strict]]) 其中search_value为则只返回该值的键名 $a = array("name"=>"张三","age"=>20,"sex"=>"男"); $keys = array_keys($a); for($i=0;$i"张三","age"=>20,"sex"=>"男"); if(in_array("张三",$a)){ echo " ‘张三’在\$a数组中"; //”张三“在$a数组中 } ™ array_flip -- 交换数组中的键和值 ¾ 格式:array array_flip ( array trans ) $a = array("name"=>"张三","age"=>20,"sex"=>"男"); $b = array_flip($a); foreach($b as $k=>$v){ echo "$k=>$v "; // 张三=>name 20=>age 男=>sex } ™ array_reverse -- 返回一个单元顺序相反的数组 ™ 语法:array array_reverse ( array array [, bool preserve_keys] ) 如果 preserve_keys 为 TRUE 则保留原来的键名 $a = array("name"=>"张三","age"=>20,"sex"=>"男"); $b = array_reverse($a); foreach($b as $k=>$v){ echo “$k=>$v ”; // sex=>男 age=>20 name=>张三 } 5.2 统计数组元素的个数与唯一性 ™ count -- 计算数组中的单元数目或对象中的属性个数 ¾ 语法:int count ( mixed var [, int mode] ) ¾ 如果可选的 mode 参数设为 COUNT_RECURSIVE(或 1 ),count() 将递归地对数组计数。 ™ array_count_values -- 统计数组中所有的值出现的次数 ¾ 语法:array array_count_values ( array input ) ™ array_unique -- 移除数组中重复的值 ¾ 语法:array array_unique ( array array ) 5.3 使用回调函数处理数组的函数 ™ array_filter -- 用回调函数过滤数组中的单元 ¾ 语法:rray array_filter ( array input [, callback callback] ) ¾ 依次将 input 数组中的每个值传递到 callback 函 数。如果 callback 函数返回 TRUE,则 input 数 组的当前值会被包含在返回的结果数组中。数组的 键名保留不变。 ¾ 如果没有提供 callback 函数,array_filter() 将 删除 input 中所有等值为 FALSE 的条目。 ™ array_walk--对数组中的每个成员应用用户函数 ¾ 语法:bool array_walk ( array &array, callback funcname [, mixed userdata] ) ¾ 如果成功则返回 TRUE,失败则返回 FALSE。 ¾ 将用户自定义函数 funcname 应用到 array 数组中的 每个单元。典型情况下 funcname 接受两个参数。 array 参数的值作为第一个,键名作为第二个。如果 提供了可选参数 userdata,将被作为第三个参数传递 给 callback funcname。 ¾ array_walk() 不会受到 array 内部数组指针的影响 。array_walk() 会遍历整个数组而不管指针的位置。 ™ array_map -- 将回调函数作用到给定数组的单元上 ¾ 语法: array array_map ( callback callback, array arr1 [, array ...] ) ¾ array_map() 返回一个数组,该数组包含了 arr1 中 的所有单元经过 callback 作用过之后的单元。 callback 接受的参数数目应该和传递给 array_map() 函数的数组数目一致。 5.4 数组的排序函数 ™ sort -- 对数组排序(升序) ™ rsort -- 对数组逆向排序(降序) ™ usort -- 使用用户自定义的比较函数对数组中的值进行排序 ™ asort -- 对数组进行排序并保持索引关系(关联数组排序) ™ arsort -- 对数组进行逆向排序并保持索引关系 ™ uasort -- 使用用户自定义的比较函数对数组中的值进行排序 并保持索引关联 ™ ksort -- 对数组按照键名排序 ™ krsort -- 对数组按照键名逆向排序 ™ uksort -- 使用用户自定义的比较函数对数组中的键名进行排 序 ™ natsort -- 用“自然排序”算法对数组排序 ™ natcasesort -- 用“自然排序”算法对数组进行不区分大小写 字母的排序 ™ array_multisort -- 对多个数组或多维数组进行排序 5.5 拆分、合并、分解与结合数组 ™ array_slice -- 从数组中取出一段 ¾ 语法: array array_slice ( array array, int offset [, int length [, bool preserve_keys]] ) ¾ array_slice() 返回根据 offset 和 length 参数所 指定的 array 数组中的一段序列。 ¾ 如果 offset 非负,则序列将从 array 中的此偏移量 开始。如果 offset 为负,则序列将从 array 中距离 末端这么远的地方开始。 ¾ 如果给出了 length 并且为正,则序列中将具有这么 多的单元。如果给出了 length 并且为负,则序列将 终止在距离数组末端这么远的地方。如果省略,则序 列将从 offset 开始一直到 array 的末端。 ™ array_splice -- 把数组中的一部分去掉并用其它值取代 ¾ 语法:array array_splice ( array &input, int offset [, int length [, array replacement]] ) ¾ array_splice() 把 input 数组中由 offset 和 length 指定的单元去掉,如果提供了 replacement 参数,则用 replacement 数组中的单元取代。返回一个包含有被移 除单元的数组。注意 input 中的数字键名不被保留。 ¾ 如果 offset 为正,则从 input 数组中该值指定的偏移 量开始移除。如果 offset 为负,则从 input 末尾倒数 该值指定的偏移量开始移除。 ¾ 如果省略 length,则移除数组中从 offset 到结尾的所 有部分。 ¾ 如果给出了 replacement 数组,则被移除的单元被此数 组中的单元替代。 ™ array_combine -- 创建一个数组,用一个数组的值作为 其键名,另一个数组的值作为其值 ¾ 语法:array array_combine ( array keys, array values ) ¾ 返回一个 array,用来自 keys 数组的值作为键名, 来自 values 数组的值作为相应的值。 ¾ 如果两个数组的单元数不同或者数组为空时返回 FALSE。 ™ rray_merge -- 合并一个或多个数组 ¾ 语法: array array_merge ( array array1 [, array array2 [, array ...]] ) ¾ array_merge() 将一个或多个数组的单元合并起来, 一个数组中的值附加在前一个数组的后面。返回作为 结果的数组。 ¾ 如果输入的数组中有相同的字符串键名,则该键名后 面的值将覆盖前一个值。然而,如果数组包含数字键 名,后面的值将不会覆盖原来的值,而是附加到后面 。 ¾ 如果只给了一个数组并且该数组是数字索引的,则键 名会以连续方式重新索引。 ™ array_intersect -- 计算数组的交集 ¾ 语法 array array_intersect ( array array1, array array2 [, array ...] ) ¾ array_intersect() 返回一个数组,该数组包含了所 有在 array1 中也同时出现在所有其它参数数组中的 值。注意键名保留不变。 ™ array_diff -- 计算数组的差集 ¾ 语法:array array_diff ( array array1, array array2 [, array ...] ) ¾ array_diff() 返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意键 名保留不变。 5.6 数组与数据结构 ™ array_pop -- 将数组最后一个单元弹出(出栈) ¾ 语法:mixed array_pop ( array &array ) ¾ array_pop() 弹出并返回 array 数组的最后一个单元 ,并将数组 array 的长度减一。如果 array 为空( 或者不是数组)将返回 NULL。 ™ array_push -- 将一个或多个单元压入数组的末尾(入 栈) ¾ 语法:int array_push ( array &array, mixed var [, mixed ...] ) ¾ array_push() 将 array 当成一个栈,并将传入的变 量压入 array 的末尾。array 的长度将根据入栈变量 的数目增加。 ™ array_shift -- 将数组开头的单元移出数组 ¾ 语法:mixed array_shift ( array &array ) ¾ array_shift() 将 array 的第一个单元移出并作为结 果返回,将 array 的长度减一并将所有其它单元向前 移动一位。所有的数字键名将改为从零开始计数,文 字键名将不变。如果 array 为空(或者不是数组), 则返回 NULL。 ™ array_unshift -- 在数组开头插入一个或多个 单元 ¾ 语法: int array_unshift ( array &array, mixed var [, mixed ...] ) ¾ array_unshift() 将传入的单元插入到 array 数组的 开头。注意单元是作为整体被插入的,因此传入单元 将保持同样的顺序。所有的数值键名将修改为从零开 始重新计数,所有的文字键名保持不变。 5.7 其他有用的数组处理函数 ™ array_rand -- 从数组中随机取出一个或 多个单元 ™ shuffle -- 将数组打乱 谢谢!
还剩45页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 2 人已下载

下载pdf

pdf贡献者

belm

贡献于2012-01-03

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf