--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个参数)

 

--数组的内部指针函数(操作数组的内部指针)

  • 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 $callback ] ) //使用回调函数过滤数组中的元素。依次将数组中的每个值传递到 回调函数。如果回调函数返回 TRUE,则  数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
  • bool array_walk ( array &$array , callback $funcname [, mixed $userdata ] )  //对数组中的每个成员应用回调函数,回调函数至少接收2个参数,第1个是数组元素的第2个是数组元素的,如果array_walk还有参数3,那么回调函数要有第3个参数。如果要改变数组元素的值,回调函数的第1个参数要设为引用。举例:
 
  
  1. <?php 
  2. $fruits = array("d" => "lemon""a" => "orange""b" => "banana""c" => "apple"); 
  3.  
  4. function test_alter(&$item1$key$prefix
  5.     $item1 = "$prefix: $item1"
  6.  
  7. function test_print($item2$key
  8.     echo "$key. $item2<br />\n"
  9.  
  10. echo "Before ...:\n"
  11. array_walk($fruits'test_print'); 
  12.  
  13. array_walk($fruits'test_alter''fruit'); 
  14. echo "... and after:\n"
  15.  
  16. array_walk($fruits'test_print'); 
  17. ?> 

上面程序将输出:

 
  
  1. Before ...: 
  2. d. lemon 
  3. a. orange 
  4. b. banana 
  5. c. apple 
  6. ... and after: 
  7. d. fruit: lemon 
  8. a. fruit: orange 
  9. b. fruit: banana 
  10. 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() 返回根据 offsetlength 参数所指定的 array 数组中的一段序列。
    • 如果 offset 非负,则序列将从 array 中的此偏移量开始。如果 offset 为负,则序列将从 array 中距离末端这么远的地方开始。
    • 如果给出了 length 并且为正,则序列中将具有这么多的单元。如果给出了 length 并且为负,则序列将终止在距离数组末端这么远的地方。如果省略,则序列将从 offset 开始一直到 array 的末端。
    • 注意 array_slice() 默认重置数组的。自 PHP 5.0.2 起,可以通过将 preserve_keys 设为 TRUE 来改变此行为。
  • array array_splice ( array &input, int offset [, int length [, array replacement]] )
    • array_splice()input 数组中由 offsetlength 指定的单元去掉如果提供了 replacement 参数,则用 replacement 数组中的单元取代。返回一个包含有被移除单元的数组。注意 input 中的数字键名不被保留
    • 如果 offset 为正,则从 input 数组中该值指定的偏移量开始移除。如果 offset 为负,则从 input 末尾倒数该值指定的偏移量开始移除。
    • 如果省略 length,则移除数组中从 offset 到结尾的所有部分。如果指定了 length 并且为正值,则移除这么多单元。如果指定了 length 并且为负值,则移除从 offset 到数组末尾倒数 length 为止中间所有的单元。小窍门:当给出了 replacement 时要移除从 offset 到数组末尾所有单元时,用 count($input) 作为 length
    • 如果给出了 replacement 数组,则被移除的单元被此数组中的单元替代。如果 offsetlength 的组合结果是不会移除任何值,则 replacement 数组中的单元将被插入到 offset 指定的位置。注意替换数组中的键名不保留。如果用来替换的值只是一个单元,那么不需要给它加上 array(),除非该单元本身就是一个数组。
  • 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 array_diff ( array array1, array array2 [, array ...] )
    • array_diff() 返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意键名保留不变

 

--使用数组实现堆栈

 栈结构:栈底--->  [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()去做。
  • 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

      注意: 使用本函数后会重置(reset())数组指针。

  • int array_unshift ( array &array, mixed var [, mixed ...] )
    • array_unshift() 将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变
    • 返回 array 数组新的单元数目。