<?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);
?>
转载于:https://my.oschina.net/u/932154/blog/99752