zoukankan      html  css  js  c++  java
  • PHP学习笔记之数组游标操作

     

    数组有N个单元,同时只能操作一个单元。比如循环时,只能一个一个单元读取他的值。

    那么数组是怎么记住刚才读取的是哪个单元,接着读取下个单元的呢?

    在数组内部,有一个指针,指针指向某一个单元。

    每循环一个单元,指针向尾部移动。

    游标操作函数: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));//bool(false)

    var_dump(key($arr));//NULL

    next($arr);

    var_dump(current($arr));//bool(false)

    var_dump(key($arr));//NULL

    能不能从后往前打印单元的键和值?

    即指针先指向最后,逐渐往头部移动指针。

    默认时,指针是指向第0个单元。

    要想达到效果,需要先使指针指向最后一个单元。

    然后,把指针往头部移动。

    end()函数作用是把指针指向数组的最后一个单元。

    prev()函数作用是把指针向头部移动一个单元。

    end($arr);

    echo current($arr),'<br />';//民

    echo key($arr),'<br />';//3

    prev($arr);//指针向头部移动一下

    echo current($arr),'<br />';//人

    echo key($arr),'<br />';//2

    prev($arr);//指针向头部移动一下

    echo current($arr),'<br />';//华

    echo key($arr),'<br />';//1

    prev($arr);//指针向头部移动一下

    echo current($arr),'<br />';//中

    echo key($arr),'<br />';//0

    prev($arr);//指针向头部移动一下

    var_dump(current($arr));//bool(false)

    var_dump(key($arr));//NULL

    如果数组有1000个单元,总不能一直prev($arr);或者next($arr);一千次吧?

    如何利用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

    不用foreach,就用for循环来循环数组

    $arr = array(‘name’ => ‘张三’,’age’ => ’28’,height => ‘176’,area => ‘山西’);

    用之前的知识,用for循环没办法循环此数组。

    但结合游标操作后,就可以实现:

    for(;current($arr);next($arr)){

    echo key($arr),’~’,current($arr),'<br />';

    }

    用for循环也能循环数组。

    这里只是为了练习数组游标操作,在实际开发中,推荐用foreach。

    如何打印一个单元,跳一个单元,再打印?

    $arr = array(‘中’,’华’,’人’,’民’,’共’,’和’,’国’);

    for(;current($arr);next($arr),next($arr)){

    echo key($arr),’~’,current($arr),'<br />';

    }

    如何跳两个单元,打印,再退一个单元,再打印?

    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;

    }

    }

    $arr = array(‘a’,’b’,’c’,’d’);

    echo current($arr),'<br />';//a

    foreach($arr as $v){

    echo $v,'<br />';

    }

    var_dump(current($arr));//bool(false);

    //第一个foreach已经把指针往后移出界了。

    //foreach循环结束后,并没有把内部指针初始化。

    foreach($arr as $v){

    echo $v,'<br />';

    }//第一个foreach应该把内部指针移到尾部了,第二个foreach,有没有受第一个foreach的影响?

    答:foreach在运行前,会自动reset($arr);,因此不会受上一次的影响。

    foreach循环结束后,会不会把数组内部指针reset()?

    答:不会,第9行可以证明。

    指针循环数组的陷阱

    $arr = array(0,1,2,3);

    for(;current($arr);next($arr)){

    echo current($arr);//没有结果,0相当于false,循环跳出。

    }

    如果数组某单元的值为””,0,false,’0′,null,都将导致循环退出,怎么办?

    用each解决

    PHP数组的list与each相关知识。

    each是“每一个”的意思。

    <?php

    $arr = array(‘男’,’女’,’老’,’少’);

    print_r(each($arr));

    ?>

    分析:第一个单元,键:0,值:男

    each的作用是把指针指向的当前单元的信息组成一个数组。

    数组有4个单元,具体如下:

    array(

    1 => ‘单元值’

    ‘value’ => ‘单元值’

    0 => ‘单元的键’

    ‘key’ => ‘单元的键’

    )

    array(

    1 => ‘男’

    ‘value’ => ‘男’

    0 => 0

    ‘key’ => 0

    )

    each不仅把当前指针指向的单元的信息组合成一个数组返回。

    并且把指针向尾部移动一次。

    因此,下一行打印结果:

    array(

    1 => ‘女’

    ‘value’ => ‘女’

    0 => 1

    ‘key’ => 1

    )

    print_r(each($arr));

    返回值是固定的四个单元的数组(0、key、1、value四个单元)。

    print_r(each($arr));

    print_r(each($arr));//把’幼’打出来,指针再往后移一个单元。

    var_dump(each($arr));//bool(false),因为指针已经超出数组界限了。

    each 是取出指针所指单元的键和值,组合成一个数组返回。

    并把指针向尾部移。

    如果,取不出来单元,返回bool(false)。

    //循环数组

    $arr = array(-3,-2,0,1,2,3);

    while($ceil = each($arr)){

    //如果能取出单元,则返回1、value、0、key 4个单元的数组,不为假。

    //如果指针已经超出界限,返回false,自然while结束

    echo $ceil[0].’~’.$ceil[1],'<br />';

    }

    each经常和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 />';//null孙赵

    list是如何工作的?

    因为list能够给多个变量赋值,即把数组的多个单元值分别赋给多个变量。

    那么,自然要注意1个最重要的地方。

    即把数组的单元值“对应”赋给某个变量。

    具体“对应”如下:

    在list中,按’,’隔开的顺序,从左到右,分别对应右侧数组(设为$arr)

    $arr[0],$arr[1],$arr[2]….$arr[N]

    如果需要对应的数组单元不存在,怎么办?

    答:依然是依次对应,不存在,当成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孙赵。

    仔细判断,打印$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 => ‘燕’

    )

    用each,list自己写一个模拟foreach的函数

    function for_each($arr){

    while($tmp = each($arr)){

    list($k,$v) = $tmp;

    echo $k,$v,'<br />';

    }

    }

    $arr = array(‘虎’,’驴’,’马’,’狼’);

    for_each($arr);

     
     
     
  • 相关阅读:
    单(single)
    cdq分治
    寿司
    qtth
    二分,倍增的一些思考(lost my music:可持久化栈)
    手写堆、哈希表
    保留字,关键字
    测试19,20,21
    要买的书
    测试18:T2:可爱精灵宝贝
  • 原文地址:https://www.cnblogs.com/myJuly/p/10007215.html
Copyright © 2011-2022 走看看