数组(二)
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
// 数组的游标操作
/*
数组有N个单元,同时只能操作一个单元.
比如在循环中,也得一个单元一个单元来读取
比如,刚读完第1个单元,下次来读取时,怎么"记住"该读取第2个单元的?
在数组内部,有一个指针,指针指着某一个单元.
每循环一个单元,指针往尾部移动.
*/
// current,key,
// next,prev,reset end
$arr = array('中','华','人','民');
// current "当前"的意思,该函数是 取出数组内部 指针指向的单元 的值
echo current($arr),'<br />'; // "中",数组刚创建,指针初始化指向第0个单元
echo current($arr),'<br />'; // 还是"中",因为内部的指针并没有往尾部移
// key,该函数是 取出数组内部 指针指向的单元的 "键"
echo key($arr),'<br />'; //
echo key($arr),'<br />'; // 此时指针,还是指向第0个单元
// next "下一个", 把数组内部的指针往尾部移动一个单元
next($arr);
echo current($arr),'<br />'; // 华
echo key($arr),'<br />'; // 1
next($arr);
echo current($arr),'<br />'; // 人
echo key($arr),'<br />'; // 2
next($arr);
echo current($arr),'<br />'; // 民
echo key($arr),'<br />'; // 3
next($arr);
var_dump(current($arr)); // false
var_dump(key($arr)); // null
next($arr);
var_dump(current($arr)); // false
var_dump(key($arr)); // null
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
$arr = array('中','华','人','民');
// 能不能从后到前打印出来?
// 即:指针先指向最后,逐步往头部移动指针
// 默认时,指针是指向第0个单元的,
// 要想达到想的效果,得先把指针指向最后一个单元去.
// 其次,会把指针往头部移.
// end ,该函数把指针指向数组的最后一个单元
// prev,该函数把指针往头部移动一个单元
end($arr);
echo current($arr),key($arr),'<br />'; // 民3
prev($arr); //指针往头部移动一下
echo current($arr),key($arr),'<br />'; // 人2
prev($arr); //指针往头部移动一下
echo current($arr),key($arr),'<br />'; // 华1
prev($arr); //指针往头部移动一下
echo current($arr),key($arr),'<br />'; // 中0
prev($arr); //指针往头部移动一下
var_dump(current($arr));var_dump(key($arr));; // false null
// 数组要是有1000个单元,总不能一直用手动的prev1000下,或者next1000下吧???
// 如果利用 next/prev来自动循环数组
// 不定数组的指针跑哪儿了,用reset,可以重置,使数组的指针归0,指向开头处
reset($arr);
echo current($arr),key($arr),'<br />'; // 中0
next($arr);
next($arr);
echo current($arr),key($arr),'<br />'; // 人2
reset($arr);
echo current($arr),key($arr),'<br />'; // 中0
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
// 不用foreach
// 就用for循环来循环数组
$arr = array('name'=>'张三','age'=>'28','height'=>'176','area'=>'山西');
// 以昨天的知识,用for循环是没办法循环此数组的.
// 但结合游标操作之后,就可以处理
for(;current($arr);next($arr)) {
echo key($arr),'~',current($arr),'<br />';
}
// 用for循环也能循环关联数组
// 这里只是为了练习游标操作,用for来处理 ,在实际开发中,用foreach
// 来点更有意思的,走一步,跳一步.
$arr = array('中','华','人','民','共','国');
for(;current($arr);next($arr),next($arr)) {
echo current($arr),'<br />';
}
// 再来点有意思的,走2步,退1步
// 什么时候走2步,什么时候退1步? 怎么标志?
echo '<hr />';
reset($arr); // 想想这句话为什么要用?
for($flag = true;current($arr);) {
echo current($arr),'<br />';
if($flag) {
next($arr);
next($arr);
$flag = false;
} else {
prev($arr);
$flag = true;
}
}
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
$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行可以证明.
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
// 指针循环数组时的陷阱
$arr = array(-3,-2,-1,0,1,2,3);
// for+游标操作
for(;current($arr);next($arr)) {
echo current($arr),'<br />';
}
// -3,-2,-1,当指向0的时候,0为假,因此,for循环退出.
// 如果数组某单元的值为"",0,false,'0',null
// 都将导致循环的退出.
// 怎么解决?
// 稍后用each来解决!
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
// each "每一个"
$arr = array('男','女','老','幼');
/*
分析: 第1个单元 键:0 值:男
each的作用是把指针指向的当前单元的信息组成一个数组
数组有4个单元,具体如下:
array(
1=>'单元值',
'value'=>'单元值',
0=>'单元的键',
'key'=>'单元的键'
)
arrary(
1=>'男',
'value'=>'男',
0=>0,
'key'=>0
)
*/
print_r(each($arr));
// each不仅把当前指针指向的单元的信息组合成一个数组返回
// 并且顺手把指针往尾部移动一次
/*
因此,下一行打印结果
array(
1=>'女',
'value'=>'女',
0=>'1',
'key'=>1
)
*/
print_r(each($arr));
// 返回值是固定的4个单元的数组,1 value 0 key
print_r(each($arr));
print_r(each($arr)); // 把"幼"打出来,指针再往后
var_dump(each($arr)); // false, 因为指针已经超出数组界限了
/*
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 />';
}
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
// each经常和list一起用
// 而list,是80%的PHPer都搞不清楚的一个问题
// list是重合赋值语句,可以一次性为多个变量赋值
// 下面,是常见的操作---即把数组的单元赋给多个变量
$arr = array('东','南','西','北');
$east = $arr[0];
$south = $arr[1];
$west = $arr[2];
$north = $arr[3];
// 上面的这个过程,用4次赋值,把数组的4个单元,赋给4个变量,麻烦
echo $east,$south,$west,$north,'<br />';
// 把春夏秋冬赋给4个变量
$arr = array('春','夏','秋','冬');
list($spring,$summer,$fall,$winter) = $arr;
echo $spring,$summer,$fall,$winter,'<br />';
list($a,$b,$c) = array(2=>'赵',3=>'钱',1=>'孙');
var_dump($a); echo $b,$c,'<br />';
/***
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,孙,赵
***/
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
// 仔细判断,打出$arr来
list($arr[0],$arr[1],,$arr[2]) = array(3=>'赵',1=>'钱',5=>'孙',2=>'李',0=>'燕');
print_r($arr);
/**
分析:
先从左到右来对应着分配值
$arr[0] <====> array[0] 燕
$arr[1] <====> array[1] 钱
$arr[2] <====> array[3] 赵
分配完毕,开始赋值!!!!
从右到左赋值
$arr[2] = 赵
$arr[1] = 钱
$arr[0] = 燕
数组打印,并不是如你想的,按索引的大小来打印,
而是按创建时的顺序来打印.
因此,最终打印
array(
2=>'赵',
1=>'钱',
0=>'燕'
)
**/
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
// 用each + list 自己写一个模拟foreach的函数
function for_each($arr) {
while(list($k,$v) = each($arr)) {
echo $k,$v,'<br />';
}
}
$arr = array('虎','驴','马','狼');
for_each($arr);
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
// 数组的下标应该怎么写????
// 把NOTICE级别的错误信息屏蔽掉
// 在开必项目前会专门讲错误报告设置
error_reporting(E_ALL & ~E_NOTICE);
$arr = array(1=>'中',2=>'华','name'=>'张三','area'=>'衡水');
echo $arr[1],$arr['1'],$arr["1"],'<br />';
echo $arr['name'],$arr["name"],$arr[name],'<br />';
// 1: 对于数字的索引值,不必加单双引号
// 因为加了单双引号,比如"1",则需要把"1"转成整型1,来寻找该单元.
// 影响了效率.
// 第2个问题: 字符串型的下标,要不要加单双引号????
echo '没问题---',$arr[name],'<br />';
define('name','dsafdsafdsaf');
error_reporting(E_ALL);
echo '有问题----',$arr[name],'<br />'; // 张三没打印出来!!!
/*
不仅没打出来,而且出现如下提示:
Notice: Undefined index: dsafdsafdsaf in D:\www\1009\10.php on line 29
这说明 $arr[name] -->引用的是 $arr[dsafdsafdsaf] 单元,没有这个单元,所以报NOTICE
为什么引用$arr[dsafdsafdsaf] 这个单元?
答:因为name没有加单双引号,理解成常量,并且按常量值来做下标.
如果没有该常量,再次把name当成字符串的下标来处理.
不加单双引号,流程上,先理解成常量,如无,再当成字符串,效率必然低.
*/
// 第3个问题,加单引还是加双引?
/*
在字符串学习的时候,单引号的解析速度远比双引号快.
因此,优先加 单引号.
*/
/***
总结:
数字类型的索引,不必加引号
字符串类型索引必加,而且优先加单引号
***/
浙公网安备 33010602011771号