学习目的: 了解数组的概念
学会遍历数组(一维、二维)
掌握常用的数组操作函数

1:java中数组的索引必须是一个数字,且声明数组的时候就必须确定数组的个数。
而php就比较灵活,索引可以使数字或者字符串,并且数组的个数可以随意的改变。

2:数组的概念:数组是一个可以存储一组或一系列数值的变量(复合型变量)

3:数组的分类:索引数组(索引值为数字,以0开始)和关联数组(以字符串作为索引值)

4:常用的赋值方式:
$arr[0] = 'aa';
$arr[1] = 'bb';

或者使用array() 语言结构来赋值

$arr = array('aa', 'bb');
$arr = array(array(1, 3), array(3, 4)); 二维

【注意】 数组的下标如果是等价于整数的字符串值(但不能以0开头),则会被当作整数对待。
例如: $array[3] 与  $array['3'] 引用的是相同的一个元素,而 $array['03'] 引用的则就是另外的一个元素了。

5:数组的遍历: ①for循环  ②foreach循环  ③list each 和while 配合起来循环
foreach($arr as $key=>$value)
foreach 开始循环的时候,数组内部的指针会自动指向第一个单元。
在循环中,当前单元的键和值分别赋给 $key 和 $value,并且数组中的指针自动向下一个单元移动一位。

【注意】 foreach 所操作的是一个数组的拷贝而不是数组的本身,所以每次foreach开始执行时,数组内部的指针会自动指向第一个单元,
这就意味着在foreach 循环之前不需要使用 reset()。
自 PHP 5 起,可以很容易地通过在 $value 之前加上 & 来修改数组的单元。此方法将以引用赋值而不是拷贝一个值。

each — 返回数组中当前的(键/值)对并将数组指针向前移动一步 。键值对被返回为四个单元的数组,键名为 0,1,key 和 value。
如果内部指针越过了数组的末端,则 each() 返回 FALSE。
在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用 reset(),使指针回到起始位置。

list — 把数组中的值赋给一些变量, list() 仅能用于数字索引的数组并假定数字索引从 0 开始。
[了解]list是从右到左的进行赋值。

$arr = array('one' ,'two' ,'three' ,'four');
while (list($key, $val) = each($arr)) {
echo "$key => $val<br>";
}

6:数组指针的处理函数
next  — 将数组中的内部指针向前移动一位,并且返回下一个单元的元素值。如果数组包含空的单元,或者单元的值是 0 则本函数碰到这些单元也返回 FALSE。 建议使用each
prev  — 将数组的内部指针倒回一位 (用法与next正好相反)
end   — 将 array 的内部指针移动到最后一个单元并返回其值。
reset — 将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值,如果数组为空则返回 FALSE。
current($arr) — 返回数组中的当前单元  (别名:pos) 【并不移动指针】
key($arr) — 从关联数组中取得键名

7:数组中的常用函数
count --(sizeof别名)— 计算数组中的单元数目或对象中的属性个数   int count ( mixed $var [, int $mode ] )  $var 通常都是数组类型,任何其它类型都只有一个单元。  $mode 默认值为0. 1为开启递归地对数组计数
array_count_values ( array $input ) — 统计数组中所有的值出现的次数
array_sum ( array $array ) — 计算数组中所有值的和
array_unique ( array $array ) — 移除数组中重复的值  [*新数组保留原有的下标]
array_keys( array $input [, mixed $search_value [, bool $strict ]] ) — 返回数组中所有的键名
array_values( array $input ) — 返回input 数组中所有的值并给其建立数字索引。 重复的值不做处理
in_array ( mixed $needle , array $haystack [, bool $strict ] ) — 检查数组中是否存在某个值。
如果 needle 是字符串,则比较是区分大小写的。
如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。
array_map ( callback $callback , array $arr1 [, array $... ] )— 将回调函数作用到给定数组的单元上 ,【注意】:如果使用多个数组的话,回调函数的参数个数一定要和数组的个数相匹配。
array_chunk ( array $input , int $size [, bool $preserve_keys ] ) — 将一个数组分割成多个数组,其中每个数组的单元数目由 size 决定。最后一个数组的单元数目可能会少几个。得到的数组是一个多维数组中的单元,其索引从零开始。 $preserve_keys 保留输入数组中原来的键名 默认为false
array_merge(array $array1 [, array $array2 [, array $... ]] ) 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
【注意】如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引
比较下 $arr + $arr2  数组相加 和array_merge() 函数有什么区别。

8:了解的数组函数
array_change_key_case ( array $input [, int $case ] ) — 返回字符串键名全为小写或大写的数组。 $case  CASE_UPPER 和 CASE_LOWER(默认)
array_fill ( int $start_index , int $num , mixed $value ) — 用 value 参数的值将一个数组填充 num 个条目,键名由 start_index 参数指定的开始。
array_filter ( array $input [, callback $callback ] ) — 用回调函数过滤数组中的单元. 如果 callback 函数返回 TRUE,则 input 数组的当前值会被包含在返回的结果数组中。
数组的键名保留不变.如果没有提供 callback 函数,array_filter() 将删除 input 中所有等值为 FALSE 的元素。
array_walk()
array_flip ( array $trans ) — 交换数组中的键和值
array_key_exists ( mixed $key , array $search ) — 检查给定的键名或索引是否存在于数组中,也可以用isset().  isset() 对于数组中为 NULL 的值不会返回 TRUE,而 array_key_exists() 会。
array_search ( mixed $needle , array $haystack [, bool $strict ] )— 在数组中搜索给定的值,如果成功则返回相应的键名
array_rand ( array $input [, int $num_req ] )— 从数组中随机取出一个或多个单元

9:数组和变量之间的转换
(1) extract ( array $var_array [, int $extract_type [, string $prefix ]] )
将var_array数组中的键名当作变量名,值作为变量的值。
对每个键/值对都会在当前的页面中建立变量,并受到 extract_type 和 prefix 参数的影响。
如果带操作的数组时索引数组的话,如果把键名转换为变量的话,则都是一些不合法的变量(变量不能以数字开始),因此就需要使用第二、三个参数
EXTR_OVERWRITE       如果有冲突,覆盖已有的变量。
EXTR_SKIP            如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME     如果有冲突,在变量名前加上前缀 prefix 。
EXTR_PREFIX_ALL      给所有变量名加上前缀 prefix 。自 PHP 4.0.5 起这也包括了对数字索引的处理。
EXTR_PREFIX_INVALID  仅在非法/数字的变量名前加上前缀 prefix 。本标记是 PHP 4.0.5 新加的。
EXTR_IF_EXISTS       仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。
EXTR_PREFIX_IF_EXISTS 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。本标记是 PHP 4.2.0 新加的。
EXTR_REFS            将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。
(2) compact ( mixed $varname [, mixed $... ] ) 建立一个数组,包括变量名和它们的值,如果参数中的字符串对应的变量不存在,则忽略掉。

10:数组与字符串之间的转换
(1)array  explode ( string $separator , string $string [, int $limit ] )  使用一个分隔字符来分隔一个字符串。
$limit 表示分隔为数组的单元个数,而最后那个单元将包含 string 的剩余部分。
如果 limit 参数是负数,则返回除了最后的 limit 个元素外的所有元素。此特性是 PHP 5.1.0 中新增的。

(2)string implode ( string $glue , array $arr )  使用一个连接符将数组中的每个单元连接为一个字符串。
$glue 和 $arr 的位置可以互换。
join 为 implode 的别名

11:数组和栈
数组可以做栈使用,栈底指向数组的第一个元素,栈顶指向数组中的最后一个元素。
对栈的主要操作有两种:即入栈 和 出栈

(1)入栈
int array_push ( array &$array , mixed $var [, mixed $... ] ) — 将一个或多个单元压入数组的末尾(入栈).返回值:新数组的单元总数. 类似于 $arr[] = $var; (推荐使用这种方式)
int array_unshift ( array &$array , mixed $var [, mixed $... ] ) — 将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。

(2)出栈
array_pop( array &$array ) —  弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一。如果 array 为空(或者不是数组)将返回 NULL。
array_shift ( array &$array ) —  将 array 的第一个单元移出并作为结果返回,将 array 的长度减一并将所有其它单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名将不变。如果 array 为空(或者不是数组),则返回 NULL。

12:数组的排序
(1)正向排序
sort ( array &$array [, int $sort_flags ] ) — 对数组按照值排序,当本函数结束时数组单元将被从最低到最高重新安排。
asort ( array &$array [, int $sort_flags ] ) — 对数组进行排序并保持索引关系(其他的同sort)
ksort ( array &$array [, int $sort_flags ] ) — 对数组按照键名排序,保留键名到数据的关联。(本函数主要用于关联数组)

(2)反向排序
rsort( array &$array [, int $sort_flags ] ) — 对数组逆向排序,本函数对数组进行逆向排序(最高到最低)。
arsort( array &$array [, int $sort_flags ] ) — 对数组进行逆向排序并保持索引关系
krsort( array &$array [, int $sort_flags ] )— 对数组按照键名逆向排序,保留键名到数据的关联。主要用于关联数组。

(3)【了解】用户自定义排序
usort ( array &$array , callback $cmp_function ) — 使用用户自定义的比较函数对数组中的值进行排序
uksort ( array &$array , callback $cmp_function ) — 使用用户自定义的比较函数对数组中的键名进行排序
uasort ( array &$array , callback $cmp_function ) — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联