■PHP的数组
☆数组:数据的有序集合。
☆二维数组:“数组的数组” ,即 由数组作为元素 而组成的数组。
为什么PHP的程序员很少接触到 数据结构 ?
(例如 C语言 中的 链表、栈、队列 及 排序算法 等,PHP程序员都很少碰得到。)
因为 PHP 有强大的数组功能,一个数组既能模拟栈,也能模拟队列,还能迅速排序(PHP数组有现成的函数可以进行排序)。
★PHP的数组为何如此强大:
在 PHP 中 数组元素存放的值可以是任意数据类型;
在 PHP 中 数组元素的下标可以是数字也可以是字符;
在 PHP 中 的数组可以动态增长。
● PHP 中定义数组有 2 种形式:
①直接对元素赋值创建数组,例如:
//人工分配下标:
$arr[0] = 'A';
$arr[1] = 35;
$arr[2] = "I'm a developer.";
//自定义字符类型的下标:
$arr['cat'] = 'A';
$arr['dog'] = 35;
$arr['boy'] = "I'm a developer.";
//自动分配下标:
$arr[] = 'A';
$arr[] = 35;
$arr[] = "I'm a developer.";
②通过 array 关键字创建数组,例如:
$arr = array('A',35,"I'm a developer.");
//自定义字符类型的下标:
$arr = array("cat"=>'A',"dog"=>35,"boy"=>"I'm a developer.");
下标全是数字的数组,我们称之为【索引数组】。
下标含有字符的数组,我们称之为【关联数组】。
★注意:
①如果有相同的下标,则会覆盖相同下标的数组元素,例如:
$arr[0] = '我';
$arr[1] = '爱';
$arr[2] = "编";
$arr[0] = "程";
print_r($arr);// 输出:Array ( [0] => 程 [1] => 爱 [2] => 编 )
②如果我们创建一个数组时,没有给某个元素指定下标,则按已存在的最大的整数下标 +1 ,作为该元素的下标。如果数组中本来就没有整型的下标,则以0作为该元素下标。
③与 C语言 不同,PHP中以数组名作为函数实参时,并不是传递其首元素地址(即 形参的改变 不会影响实参)。例如:
$arr = array('张三','李四','王五');
function f($arr_xing){
$arr_xing[0] = '零';
$arr_xing[1] = '壹';
$arr_xing[2] = '贰';
print_r($arr_xing);
}
f($arr);// 输出:Array ( [0] => 零 [1] => 壹 [2] => 贰 )
echo '<br />';
print_r($arr);// 输出:Array ( [0] => 张三 [1] => 李四 [2] => 王五 )
我们通常使用 print_r 来显示整个数组的情况。如:
pirnt_r($arr);
或使用 var_dump ,如:
var_dump($arr); // var_dump 更详细。
★新增一个数组元素的最简单直接的方式,如下:
$arr = array('张三','李四','王五');
$arr[] = '赵六'; // 给数组 $arr 新增一个元素。
$arr['最后的'] = '黄七'; // 新增一个下标为字符的元素也可以。
★清除一个数组元素,如下:
unset($arr[1]); // 利用 unset() 函数。
注意,PHP 和 JS 不同:
在 PHP 中 如果数组某个元素被清除,数组元素的下标不会重新排序。
而在 JS 中 如果清除了某个数组元素,则数组元素的下标会重新排序。
■遍历数组:
在 PHP 中数组元素的下标 可以是 无规律的整型数值,也可以是 字符型数据。在这些情况下元素的下标没有规律,所有无法对数组进行一般的循环遍历。
因此我们可以通过以下两种方法遍历数组:
①通过 foreach 语句遍历数组,例如:
/* $value 只是临时变量,并不代表 数组元素 本身。*/
foreach($arr as $value){
echo $value.'<br />';
}
通过 foreach 语句,下标也可以被遍历出来,例如:
/* $key 与 $value 只是临时变量,并不代表 元素下标 及 元素 本身。*/
foreach($arr as $key => $value){
echo $key.'='.$value.'<br />';
}
② 通过 each()函数 和 list 语句 遍历数组:
each()
——作用:将当前被内部指针指向的数组元素的 键(下标) 和 值 组织成一个数组 并返回,然后将数组指针向前移动一步。
——注意:在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用 reset()。
list()
——作用:从数组分配值给一个或多个变量。
例如:
list($a,$b,$c,$d) = array(0=>'中',1=>'华',2=>'人',3=>'民');
/*
$a、$b、$c、$d 分别对应 下标为整数 0、1、2、3 的元素。
从右往左的方向 给变量赋值。(即 先把'民'赋给$d,然后把'人'赋给$c,再把'华'赋给$b,……)
非整型下标会自动被屏蔽掉。
*/
——注意:list() 像 array() 一样,list() 这不是真正的函数,而是语言结构。
/* each() 和 list() 配合,实现循环遍历数组 */
while(list($key,$value)=each($arr)){
echo $key.'='.$value.'<br />';
}
■数组游标操作:
每个数组中都有一个内部的指针指向它“当前的”元素,初始指向插入到数组中的第一个元素。
current()
——作用:current() 函数返回当前被内部指针指向的数组元素的值,并不会移动指针。如果内部指针指向超出了元素列表的末端,current() 返回 FALSE。
next()
——作用:next() 和 current() 的行为类似,只有一点区别,在返回值之前将内部指针向前移动一位。这意味着它返回的是下一个数组元素的值并将数组指针向前移动了一位。
prev()
——作用:prev() 和 next() 的行为类似,只除了它将内部指针倒回一位而不是前移一位。
end()
——作用:将数组的内部指针移动到最后一个元素,并返回其值。
reset()
——作用:将数组的内部指针倒回到第一个元素,并返回第一个数组元素的值。
key()
——作用:返回数组中当前元素的键名(下标)。
例如:
/* 要求 走两步,退一步 */
$arr = array('中','华','人','民','共','和','国'); //你个个 大师傅
$v='';
for(;$v=current($arr);){
echo $v;
next($arr);
echo next($arr);
prev($arr);
}
// 输出:中人华民人共民和共国和
■常用数组函数:
1.使用 count 函数统计数组元素个数;
2.使用 is_array 函数判断变量是否是数组;
3.print_r 和 var_dump 函数可以显示数组信息;
4.拆分字符串 explode ;
5.对数组排序 sort ;
6.删除数组中的某个元素 unset 。