--php数组不限制长度,不限制数据类型。
这个特性和c语言堆比较像,因此数组可以很方便构建c语言中堆可以构建的数据结构(链表,队列,栈,集合)。
--数组的结构:数组由元素组成,每个元素由下标(或者叫键)和值组成。
数组的下标只能是整数或字符串。
--索引数组与关联数组
- 索引数组:下标是顺序整数的数组。
- 关联数组:下标是字符串的数组。
--数组的声明方式
- (适用于分多次声明数组元素,比如在for循环中)直接给数组元素赋值,就会自动生成数组。比如$usr[0]=10,$usr[1]="zhangsan",$usr[2]="nan",虽然就像其他语言给已有的数组元素赋值那样,在php中会自动创建一个数组,在这里就创建了$usr[]数组,它目前有3个元素,后面还可以再加(元素个数不限),里面的类型也不限。
- 如果数组下标不给出,将被认为是索引数组,下标从0开始。
- 如果连续给出几个整数下标,下一个未给出的将从上面最大的整数开始。
- 如果后面出现前面的下标,则被认为前面元素的重新赋值。
- 混合声明时,索引和关联不互相影响(关联不会影响索引的声明)
- 用array()函数创建,适用于一次性声明数组所有元素。
- 默认是索引数组。
- 如果要为关联数组和索引数组指定下标,使用 键=>值,比如$usr=array("id"=>1,"name"=>"zhangsan",100=>10);
- 如何声明多维数组:各元素(可能本身也是数组)之间用","分隔。比如array(array(),array(),"zhangsan");
- 用其他函数创建。(比如file()函数就会返回一个数组)
--数组的遍历
- 使用for()语句,循环遍历数组(不常用,因为它有限制,要求数组必须是索引数组,而且下标是连续的)。
- 使用foreach()语句,循环遍历数组。(最常用方式)
- 使用格式:foreach(数组名 as 变量){ 循环体 }//变量是自定义的
- 注意事项:
- foreach循环次数由数组元素个数自动决定。
- 每一次循环都将数组元素赋给变量。
- 如果需要下标的值:foreach(数组名 as 下标变量=>值变量)//下标变量,值变量都是自定义的
- 使用while() list() each()语句,循环遍历数组。(list()多用在分隔字符串形成的数组中)
- each函数(把数组的当前参数的键和值组成一个数组返回)
- 需要一个数组作为参数。
- 返回来也是一个数组,返回的数组包含4个元素,下标是0,"key",1,"value"。
- 0,"key"是(each函数的参数数组)数组当前参数的键。
- 1,"value"是(each函数的参数数组)数组当前参数的值。
- 默认的当前元素就是第一个元素。
- 每执行一次,当前元素就往后移动一个。执行到数组末尾,函数返回false。
- list函数(将数组元素转换为变量)
- 格式:list($a,$b)=array(1,2);
- 需要将一个数组赋值给这个函数(c语言中没有出现过将数组赋给函数的)
- 数组元素的个数要与函数参数个数相同。
- 数组的各个元素被赋值给函数的各个参数,list()将参数转换为变量供后面使用。
- 只接受索引数组。按索引下标的顺序赋值给各个参数(下标为0的赋值给第1个参数)
- each函数(把数组的当前参数的键和值组成一个数组返回)
--数组的内部指针函数(操作数组的内部指针)
- reset(数组名);//复位数组指针
- end(数组名);//指向最后一个元素
- next(数组名);//返回数组内部指针指向的下一个单元的值,或当没有更多单元时返回 FALSE。
- prev(数组名);//返回数组内部指针指向的前一个单元的值,或当没有更多单元时返回 FALSE。
- current(数组名);//返回当前元素的值
- key(数组名);//返回当前元素的键
--超全局数组(自动全局变量)
- 包含了来自web服务器,客户端,运行环境和用户输入的数据。
- 全局范围生效,可以直接使用这些数组。
- 用户不能自定义这些数组,但这些数组的操作方式与我们自定义数组的操作方式一样。
- 在任何函数中都可以直接使用(普通全局变量需要先用global声明)
- 存放在超全局数组里的变量(比如GET传的变量),可以直接当做变量来用(尽量不要这样使用,因为如果php.ini中register_globals如果选为off就不能这么用的,尽管默认虽然为On)。
- 常见的超全局数组:
- $_GET //经URL请求,提交至服务器脚本的变量。所有链接后面的参数默认都是以GET请求的方式传至服务器脚本。
- $_POST //经HTTP POST方法,提交至服务器脚本的变量。POST方法比GET安全,POST提交的数据封装在HTTP数据体中(GET方法的数据放在HTTP头中),如果上传文件的话也只能用POST
- $_REQUEST //经GET,POST,COOKIE机制提交至脚本的变量,因此这个数组不值得信任,尽量不要使用。
- $_FILES
- $_COOKIE
- $_SESSION
- $_ENV //执行环境提交至脚本
- $_SERVER //由web服务器设定或和当前脚本的执行环境相关联
- $GLOBALS //当前有效的所有全局变量,元素键名为变量名
--$GLOBALS用法:
因为$GLOBALS里面有所有全局变量,而且GLOBALS本身是超全局变量(可以在任何函数中使用),那么这些全局变量就可以通过GLOBALS在任意函数中使用,而不必通过global关键字声明了。比如$a=3;function demo(){echo $GLOBALS["a"];}
--和数组 键/值 操作有关的函数
- array array_values(数组名) //返回数组的所有值,也是个数组,是个索引数组。所以它可以把任意数组都变为索引数组,操作数必须是索引数组的函数可以配合它(比如list)使用。
- array array_keys(数组名,[元素值[,true/false]] ) //返回键,也是个数组,默认返回所有键;如果指定了元素值,则返回与元素值相等的特定键;最后1个参数“真/假”规定了是否需要类型也相等,默认为false(不需要)
- bool in_array(mixed 值,数组名[,true/false]) //判断值是否在数组中,最后1个参数“真/假”规定了是否需要类型也相等,默认为false(不需要)
- bool array_key_exists(键,数组名) //判断键是否在数组中
- array array_flip(数组名) //交换数组中所有键与值,如果交换后出现相同的键,则后面键的值覆盖前面的
- array array_reverse ( array array [, bool preserve_keys] ) //返回一个单元顺序相反的数组(注意:是返回新数组,而不是修改老数组),如果preserve_keys 为"TRUE",则逆序后的数组仍保持原来的键值,比如原来数组索引为0-9,preserve_keys为TRUE时,逆序后数组索引是9-0.
--统计数组元素个数和唯一性的函数
- int count(数组名[,0/1]),它的别名函数int sizeof(数组名[,0/1]) //返回数组元素个数,第2个参数是查找模式,默认为0(不递归查找子数组元素个数),如果为1,则计算子数组的元素
- array array_count_values(数组名) //返回数组各个值出现的次数,也是一个数组,返回的数组用原数组的值作为键,用该值出现的次数作为值。对输入数组的要求是,不能是嵌套数组。
- array array_unique(数组名) //移除数组中重复的值,返回也是个数组,如果有重复的只留第1个
--使用回调函数处理数组的函数
- array array_filter ( array $input [, $callback ] ) //使用回调函数过滤数组中的元素。依次将数组中的每个值传递到 回调函数。如果回调函数返回 TRUE,则 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
- bool array_walk ( array &$array , $funcname [, $userdata ] ) //对数组中的每个成员应用回调函数,回调函数至少接收2个参数,第1个是数组元素的值,第2个是数组元素的键,如果array_walk还有参数3,那么回调函数要有第3个参数。如果要改变数组元素的值,回调函数的第1个参数要设为引用。举例:
- <?php
- $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
- function test_alter(&$item1, $key, $prefix)
- {
- $item1 = "$prefix: $item1";
- }
- function test_print($item2, $key)
- {
- echo "$key. $item2<br />\n";
- }
- echo "Before ...:\n";
- array_walk($fruits, 'test_print');
- array_walk($fruits, 'test_alter', 'fruit');
- echo "... and after:\n";
- array_walk($fruits, 'test_print');
- ?>
上面程序将输出:
- Before ...:
- d. lemon
- a. orange
- b. banana
- c. apple
- ... and after:
- d. fruit: lemon
- a. fruit: orange
- b. fruit: banana
- c. fruit: apple
- array array_map(callback callback, array arr1 [, array ...] ) //将回调函数作用在各数组对应(排序相同)的各个元素上,回调返回值就是返回数组的元素。回调函数就受的参数个数应该等于array_map接受的数组个数。
--数组的排序(简单的排序,根据值进行排序,将丢失键值对应关系)
- bool sort ( array &array [, int sort_flags] ) //对数组进行从小到大的排序,注意:参数&array是引用,函数不仅仅是排序,它将赋予数组新的键名。sort_flags用于标识是按数字排序,还是按字符串排序。
- bool rsort ( array &array [, int sort_flags] ) //对数组进行从大到小的排序,注意:参数&array是引用,函数不仅仅是排序,它将赋予数组新的键名。sort_flags用于标识是按数字排序,还是按字符串排序。
--数组的排序(根据键对数组进行排序)
- bool ksort ( array &array [, int sort_flags] ) //对数组键名进行从小到大的排序,注意:参数&array是引用,函数将保留键与值的对应关系。sort_flags用于标识是按数字排序,还是按字符串排序。
- bool krsort ( array &array [, int sort_flags] ) //对数组键名进行从大到小的排序,注意:参数&array是引用,函数将保留键与值的对应关系。sort_flags用于标识是按数字排序,还是按字符串排序。
--数组的排序(根据值进行排序,保留键值对应关系)
- bool asort ( array &array [, int sort_flags] ) //对数组值进行从小到大的排序,注意:参数&array是引用,函数将保留键与值的对应关系。sort_flags用于标识是按数字排序,还是按字符串排序。
- bool arsort ( array &array [, int sort_flags] ) //对数组值进行从大到小的排序,注意:参数&array是引用,函数将保留键与值的对应关系。sort_flags用于标识是按数字排序,还是按字符串排序。
--数组的排序(根据自然数进行排序)
自然数:不是按字母顺序,而是按人的识别顺序排序字符串,比如"file2"按自然数就拍在"file11"的前面。是人们通常对字母-数字字符串进行排序的方法。
- bool natsort(array &array) //按自然数进行排序,保持键值对应关系。
- bool natcasesort(array &array) 按自然数进行排序,保持键/值对应关系。不区分大小写。
--数组的排序(根据用户自定义规则进行排序)
- bool usort ( array &array, callback cmp_function ) //用户自定义的函数决定了数组里元素间按值比较的比较规则,比较函数cmp_function必须在第一个参数被认为小于,等于或大于第二个参数时分别返回一个小于0,等于0或大于0的整数。得到的数组将丢失键/值对应关系。
- bool uasort ( array &array, callback cmp_function ) //用户自定义规则排序,得到数组将保留键/值对应关系。
- bool uksort ( array &array, callback cmp_function ) //用户自定义函数决定了数组里元素间按键比较的比较规则,得到数组将保留键/值对应关系。
--数组的拆分、合并、分解、接合
- 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_slice() 默认将重置数组的键。自 PHP 5.0.2 起,可以通过将
preserve_keys
设为 TRUE 来改变此行为。
- array_slice() 返回根据
- 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
到结尾的所有部分。如果指定了length
并且为正值,则移除这么多单元。如果指定了length
并且为负值,则移除从offset
到数组末尾倒数length
为止中间所有的单元。小窍门:当给出了replacement
时要移除从offset
到数组末尾所有单元时,用 count($input) 作为length
。 - 如果给出了
replacement
数组,则被移除的单元被此数组中的单元替代。如果offset
和length
的组合结果是不会移除任何值,则replacement
数组中的单元将被插入到offset
指定的位置。注意替换数组中的键名不保留。如果用来替换的值只是一个单元,那么不需要给它加上 array(),除非该单元本身就是一个数组。
- array_splice() 把
- array array_combine ( array keys, array values )
-
返回一个 array,用来自
keys
数组的值作为键名,来自values
数组的值作为相应的值。 - 如果两个数组的单元数不同或者数组为空时返回 FALSE。
-
- array array_merge ( array array1 [, array array2 [, array ...]])
- array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
- 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
- 如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。
- array array_intersect ( array array1, array array2 [, array ...] )
- array_intersect() 返回一个数组,该数组包含了所有在
array1
中也同时出现在所有其它参数数组中的值。注意键名保留不变。
- array_intersect() 返回一个数组,该数组包含了所有在
- array array_diff ( array array1, array array2 [, array ...] )
- array_diff() 返回一个数组,该数组包括了所有在
array1
中但是不在任何其它参数数组中的值。注意键名保留不变。
- array_diff() 返回一个数组,该数组包括了所有在
--使用数组实现堆栈
栈结构:栈底---> [0]=>a0,[1]=>a1,[2]=>a2,[3]=>a3 <-----栈顶,插入、删除都在这里 |
- int array_push ( array &array, mixed var [, mixed ...] )
- array_push() 将
array
当成一个栈,并将传入的变量压入array
的末尾。array
的长度将根据入栈变量的数目增加。和如下效果相同:$array[]=$var; //不写索引,将默认加到数组最后 - 并对每个
var
重复以上动作。因为直接赋值的方法效率更高,所以入栈通常不用函数array_push()去做。
- array_push() 将
- mixed array_pop ( array &array )
array_pop() 弹出并返回 array
数组的最后一个单元,并将数组 array
的长度减1。如果 array
为空(或者不是数组)将返回 NULL。
注意: 使用本函数后会重置(reset())数组指针。
--使用数组实现队列
队列结构:队列头,在这里删除---> [0]=>a0,[1]=>a1,[2]=>a2,[3]=>a3 <-----队列尾,在这里插入
- 插入元素和栈插入相同,可以元素直接赋值,或者用array_push在队列尾部插入
- 删除元素用array_shift()函数,从队列头部删除
- mixed array_shift ( array &array )
- array_shift() 将
array
的第一个单元移出并作为结果返回,将array
的长度减一并将所有其它单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名将不变。如果array
为空(或者不是数组),则返回 NULL。注意: 使用本函数后会重置()数组指针。
- array_shift() 将
- int array_unshift ( array &array, mixed var [, mixed ...] )
- array_unshift() 将传入的单元插入到
array
数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。 - 返回
array
数组新的单元数目。
- array_unshift() 将传入的单元插入到