php数组

<?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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值