<?php /*数组的概念类似与柜子 1: 柜子的编号----> 键/key/index/索引/下标 (一般而言,编号是字符时,叫"键/key",编号是数字时,叫"索引/index") 2: 柜子储存的内容----> 值/value ****/ //数组创建 $arr=array(); //空数组 $arr=array(1,2,3); $arr2[]=1; //声明一个数组$arr2并赋值第一个元素 $arr2[0]=1 $arr2[]=2; echo $arr2[0]; //1 echo $arr2[1]; //2 $stars[] = '黎明'; // 不断的开辟一个新单元 // PHP中有8种变量类型 // 答: 可以容纳PHP中的所有合法类型,即8种都可以,意味着,单元的值,还可以是数组 // 如下这种情况,称为"二维数组" $class['stu1'] = array('name'=>'张三','age'=>'28'); //二维数组 echo $class['stu1']['age']; //修改数组 $arr[2] = '族'; echo '<hr />'; print_r($arr); // 删一个单元 unset($arr[3]); //如果索引是纯数字,这种数组称为"索引数组", //否则,称为关联数组. //循环取值 $arr = array('春','夏','秋','冬'); //此方法每次调用count函数。没有优化 for($i=0;$i<count($arr);$i++) { echo $arr[$i],'<br />'; } //推荐此方法 for($i=0,$len=count($arr);$i<$len;$i++){ echo $arr[$i].'<br/>'; } //foreach循环 //$key 是键 $v是值都是临时存储变量 foreach($arr as $key=>$v){ echo $key.'---'.$v.'<br/>'; } foreach($arr as $v) { // 这是说:循环数组的每个单元,把单元的值,赋给$v echo $v,'<br />'; } //陷阱 // 有人说,我不想循环时,要数组的值,我只想循环打印数组的键 foreach($arr as $k) { echo $k,'<br />'; // 打印的还是值,$k只是被赋值而已 } // 数组的游标操作 /* 数组有N个单元,同时只能操作一个单元. 比如在循环中,也得一个单元一个单元来读取 比如,刚读完第1个单元,下次来读取时,怎么"记住"该读取第2个单元的? 在数组内部,有一个指针,指针指着某一个单元. 每循环一个单元,指针往尾部移动. */ // current,key, // next,prev,reset end $arr = array('中','华','人','民'); echo key($arr),'<br />'; // 此时指针,还是指向第0个单元 echo current($arr).'<br/>'; //取当前指针的值 echo next($arr).'<br/>'; //打印华 指针想后面移一步 echo reset($arr); //打印中 ,向前移一步 echo end($arr); //打印民 ,取最后一个单元 // 不定数组的指针跑哪儿了,用reset,可以重置,使数组的指针归0,指向开头处 reset($arr).'<br/>'; echo '<hr>'; // 来点更有意思的,走一步,跳一步. $arr = array('中','华','人','民','共','国'); for(;current($arr);next($arr),next($arr)) { echo current($arr),'<br />'; } // 再来点有意思的,走2步,退1步 // 什么时候走2步,什么时候退1步? 怎么标志? echo '<hr />'; reset($arr); // 想想这句话为什么要用? 因为上次for循环将指针跳出了界限 为false 不加reset则什么都不输出 for($flag = true;current($arr);) { echo current($arr),'<br />'; if($flag) { next($arr); next($arr); $flag = false; } else { prev($arr); $flag = true; } } //用foreach 循环 $arr = array('a','b','c','d'); echo current($arr),'<br />'; // a foreach($arr as $v) { echo $v,'<br />'; } var_dump(current($arr)); // 此处是false,因为foreach循环时,试图努力的往后移动指针,直到移出界,foreach结束 // foreach结束后,并没有帮我们把指针初始化 foreach($arr as $v) { echo $v,'<br />'; } // 第1个foreach应该把指针移到尾部去了, 第2个foreach,会不会受第1个foreach的影响, // 答:foreach在运行前,会自动reset数组,因此不会受上一次的影响. // 问:foreach循环后,会不会帮我们把数组reset指针初始化? // 答;不会,第9行可以证明. //each //each 取出指针所指单元的键和值,组合成一个数组返回, //并把指针往尾部移 //如果 取不出来单元,返回false // 打印 键-值 echo '<hr />'; $arr = array(-3,-2,-0,1,2,3); while($ceil = each($arr)) { // 如果能取出单元,则返回1,value,0,key4单元的数组,不为假 // 如果指针已经超出界限,返回false,自然while结束 echo $ceil[0],'~',$ceil[1],'<br />'; } echo '<hr/>'; //list list($a,$b,$c) = array(2=>'赵',3=>'钱',1=>'孙'); var_dump($a); echo $b,$c,'<br />'; //打印null因为 数组没有索引 0 $a,$b,$c 是与下标0开始递增映射的。 list($arr1[0],$arr1[1],$arr1[2]) = array(2=>'燕',0=>'钱',5=>'孙',3=>'李',1=>'赵'); print_r($arr1); //燕,赵,钱 //赋值的时候$arr1[2],$arr1[1],$arr1[0] /*** list是如何工作的? 因为list能够给多个变量赋值,即把数组的多个单元分别赋给多个值. 那么,自然要注意1个最重要的地方 即-----把数组的哪个单元 对应 赋给哪个变量??? 具体对应如下: 在list中,按","隔开的顺序,从左到右,分别对应右侧数组(设为$arr) $arr[0],$arr[1],$arr[2],.... $arr[N] 如果需要对应右侧的$arr[x] 不存在怎么办? 答:依然是先对应,不存在,当成NULL来处理. $a <===> $arr[0] $b <===> $arr[1] $c <===> $arr[2] 映射工作完成!!!!! 开始赋值! 赋值的过程,和映射的顺序是反的,是从右往左赋的值 $c = $arr[2]; $b = $arr[1]; $a = $arr[0]; $c = '赵'; $b = '孙'; $a = NULL; // $arr[0]不存在 赋值完毕!!!!!!!!! 因此,最终打印 NULL,孙,赵 ***/ //list 与each结合循环 function list_each($arr){ while(list($k,$v)=each($arr)){ echo $k.'---'.$v.'<br/>'; } } $arr = array('虎','驴','马','狼'); list_each($arr); ?>