• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP 数组操作详解【遍历、指针、函数等】

    本文实例总结了PHP 数组操作。分享给大家供大家参考,具体如下:

    数组

    数据由元素组成,元素由键和值组成

    数组分类

    关联数组
    关联数组,元素的下标与元素的值存在逻辑上的关系,称之为关联数组。指的是,键和值之间存在管理。

    $a1 = array('name' => '李寻欢', 'age' => 34);  
    

    索引数组
    索引数组,元素的值和下标不存在逻辑关系,而下标只表示值索引位置。

    $a1 = array('李寻欢',34);
    

    数组遍历

    所要的完成遍历数组,需要依次得到每个元素的信息(键的信息和值的信息).核心在于数组的元素指针上

    数组的元素指针

    每一个数组内的,都有一个内部的指向某个元素的指针。
    默认情况下,这个指针指向数组的第一个元素.
    每个数组只有一个指针,同时时刻,只能指向一个元素,因此指针的位置,可以是任意一个已存在的元素。同时指针可能指向数组的外部(数组的末端[最后一个的外边]),就是非法位置.

    数组遍历就是
    获得指针指向的元素的信息,移动指针,配合循环结构就可以完成。

    php提供

    current(); 得到当前指针指向元素的值
    key(); 得到当前指向元素的键
    next(); 可以移动数组的指针

    prev(); 向上移动一个元素.
    reset(); 重置指针(移动到第一个元素)
    end(); 移动到最右一个元素

    数组末端,最右一个元素往右,非法的范围

    next(), 和prev(); 可以将数组指针移动到非法位置上.

    //$students 是数组
    end($students);
    next($students);
    var_dump(current($students)); //false;
    
    reset($students);
    prev($students);
    var_dump(current($students)); //false;
    

    如果已经移动到非法位置,不可相对移动来挽回,此时,需要强制移动到某个位置, reset() , 和 end()

    //$students 是数组
    end($students);
    next($students);
    prev($students);
    var_dump(current($students)); //false;
    
    reset($students);
    prev($students);
    next($students);
    var_dump(current($students)); //false;
    

    foreach()

    foreach(); 结构
    专门用于数组遍历的一个结构,也是一个循环结构

    foreach ( $arr as $key => $val ) {
      //循环体
    }
    

    如果元素的键,没有意义的话,可以使用 省略键的信息

    foreach ( $arr as $val ) {}
    

    注意:

    foreach会移动数组指针,并且,在foreach遍历完毕后,指针处于非法位置(数组末端)
    foreach在遍历一个数组元素时,会初始化元素指针,因此指针所指向的位置,不会影响到foreach的遍历
    foreach在遍历时,原数组的拷贝,而不是直接在原数组进行遍历,如果在遍历过程中,对遍历的数组进行修改,是不会影响到遍历的结果
    foreach所使用的保存元素值的变量,对其操作,不会对原数组产生影响
    对值的操作,同时支持引用传递:可以改变原数组的值。

    只需要在变量前增加符号 即可。

    foreach流程图

    foreach也是循环结构, 受break和continue的控制。

    each()

    遍历每一个
    可以获得当前的元素信息。(键和值),同时向下移动指针
    获得元素信息,返回的是, 关联和索引数组
    其中:
    关联数组部分。

    key => 当前元素的键
    value => 元素的值

    索引数组部分

    0 => 元素的下标
    1 => 元素的值
    
    $arr = array(10, 12, 200);
    
    $arr2 = array(
      'name' => 'zf',
      'age' => 20
    );
    
    var_dump(each($arr));
    var_dump(each($arr2));
    

    只遍历第一项
    由于each既可以获取元素信息,又可以移动指针,因此非常适合完成除foreach外的手动的数组的遍历.

    each+while+list的遍历数组

    each如果指针非法,each返回false。 判断each的返回值

    // 先eaech,将each的结果赋给$element
    // 判断$element 是否成立(自动转成布尔类型)
    
    while($element = each($sutdents)) {
      echo 'Key:', $element[0];
      echo '$nbsp;';
      echo 'Value:', $element[1];
      echo 'br/>';
    }
      

    list()
    可以使在遍历的循环体内直接使用保存元素下标的变量.直接使用保存元素下标的变量和保存元素值的变量.
    一个函数,可以通过一个数组,针对多个变量同时初始化

      
    $student = array('李寻欢', '天机老人', '阿飞');
    
    list($a, $b, $c) = $student; // 将数组内的元素, 以此赋值给list结构中的变量  // 类似 es6 中的解构赋值
    
    var_dump($a, $b, $c);
    

    list 针对索引数组生效

    $student = array('李寻欢', '天机老人', '阿飞');
    
    while (list($k, $v) = each($student)) {
      
      echo 'Key:', $k;
      
      echo 'nbsp;';
      
      echo 'Value:', $v;
      
      echo 'br/>';
      
    };
    

    数组复制元素指针

    如果原数组指针合法:
    数组在复制时,指针位置也会随之复制到目标数组内.

    $a1 = array('a', 'b', 'c');
    
    $a2 = $a1;
    var_dump(current($a2)); // a
    
    echo 'hr/>';
    
    $a1 = array('a', 'b', 'c');
    next($a1);
    
    $a2 = $a1;
    var_dump(current($a2)); // b
    

    如果原数组指针非法:
    将重置新数组的指针; 重置为默认指针.

    $a1 = array('a', 'b', 'c');
    
    end($a1);
    
    next($a1);
    
    $a2 = $a1;
    
    var_dump(current($a2)); // a
    

    foreach与数组指针关系

    foreach对指针的影响有不确定性,因此不要依赖foreach遍历后的指针位置,如果需要操作,需要先重置(reset();).

    数组遍历的是,原数组的拷贝,而不是直接在数组上进行操作.
    php内部优化,写时复制(COW--copy on write) .如果不对原数组执行写操作. 是不会发生复制的过程. 在对原数组进行写操作时,这个复制的过程才会发生.
    数组复制时的指针问题

    foreach遍历的时候,是拷贝,但是发生在对原数组进行操作之后.意味着,在写操作之前,遍历操作的就直接是原数组. 一旦发生了写操作,则会形成一个真实的拷贝,foreach去遍历的数组就与原数组不是同一个. 因此原数组指针就不会继续发生变化. 唯一的例外在最后一次循环体内对数组进行写操作,此时在复制前指针已经非法,则结果会被重置.

    在实际操作中,建议处理完毕后,可以立即reset();
    上面的问题,只适用于$value ,保存元素值的变量是值传递的情况,如果是引用传递的话.直接操作原数组!
    $key不能引用传递.

    array函数

    常用函数

    array_fill(起始位置,长度,内容); //使用固定值填充某些数量的元素.
    count(); //统计数组元素个数. 支持递归统计.
    range(起始范围,结束范围); //按照范围创建数组元素.
    array_merge(); //合并多个数组.

    // 注意一个下标冲突的情况,如果索引下标冲突,顺序增加.
    // 关联数组冲突. 后合并的要覆盖前面的.
    array_merge(range('a','z'),range('A','Z'));
    

    array_rand(数组,选择的数量[默认一个]); //随机从数组中取得某些元素. 得到的是随机的下标,而不是元素值. 并且,如果是多个元素,会按照下标的大小进行排序.

    shuffe(); //打乱元素顺序,参数是引用传递.

    // 验证码中的 4位 随机数
    
    // 创建一个大小混合的数组
    $chars = array_merge(range('a','z'),range('A','Z'));
    
    // 取得4个元素下标
    
    $rand_keys = array_rand($chars, 4);
    
    // 打乱
    shuffle($rand_keys);
    
    // 利用下标获取元素值
    foreach ($rand_keys as $v) {
      echo $chars[$v];
    }
      

    键值操作

    array_value(); //取得所有元素的所有值.
    array_key(); //取得所有元素的所有键.

    array_combine(); // 利用两个数组,其中一个为 键 ,另一个为值得到一个新数组.
    in_array(); //判断数组中是否有某个值
    array_key_exists(); //是否有某个元素.

    array_search(); // 在数组内查找某个元素值,找到返回 下标. 找不到返回false.
    array_filp(); // 交换元素的键和值.

    合并拆分

    '+'号

    $a1 = array(1, 2, 3, 4);
    $a2 = array(6, 7, 8);
    var_dump($a1+$a2); // 如果出现下标冲突,则忽略后边的元素
    
    

    array_merge($arr1, $arr2); // 合并多个数组.
    array_chunk($arr, len); //按照子数组的长度,进行对原数组拆分.

    explode(); //将一个字符串,按照某个字符,分割成多个部分.
    implode(); //可以将数组元素的值, 利用某个字符,连接

    $arr = array('aa', 'bb');
    
    echo $arr = implode('-', $arr); // aa-bb
    
    print_r(explode('-', $arr));
    

    compact(); 合并, 利用多个变量,合并成一个数组. 其中变量的名字作为数组的下标. 变量的值,作为值. 注意参数是变量名

    $width = 2;
    $height = 10;
    
    $arr = compact('width', 'height');
    

    extact(); 拆分,将一个变量,拆分成一个变量。每一个元素为一个变量。 下标为变量名,值为变量值. 字符串的下标.
    注意,如果当前已经存在变量名,则会发生将已有变量值替换的操作.这个是默认行为.可以修改,通过extact(),第二个参数. 默认为EXTR_OVERWRITE表示重写 //EXTR_SKIP 表示略过.

    array_diff(数组1,数组2); // 得到数组1中与数组2中不相同的元素. -- 差集 值判断.
    array_intersect(数组1,数组2);// 得到数组1中与数组2中相同的元素. --交集.

    array_map($callback, $arr1); // 对数组内的每个元素,进行一次操作.分别调用某个函数进行一次调用.
    如果函数是自定义的.
    注意,应该有参数接收元素值,同时应该有返回值

    $a1 = array(10, 20, 3);
    
    function x2 ( $item ) {
      return $item * 3;
    }
    
    $arr = array_map('x2', $a1);
    
    var_dump($arr);
    

    只负责定义,不负责调用. array_map(); 函数内部负责调用.
    可以同时接收或处理.是统一操作,一次将所有数组相同位置都操作一遍,而不是逐一操作. 因此该函数所接受的参数个数,与所传递的数组的数量应该一致.
    有一个默认操作,非常常用,利用多个数组,组合成一个新数组。要求,函数位置传递一个null.

    $names = array('z1', 'z2', 'z3');
    
    $maths = array(50, 40, 60);
    
    $score = array_map(null, $names, $maths);
    
    var_dump($score);
    

    回调函数的使用-模拟数据结构函数-排序函数


    array_walk($funcname);
    针对一个数组的每个元素进行操作,与array_map的不同点.

    $names = array('aa', 'bb', 'cc');
    
    function fn1 ( $val,$key ) {
      var_dump($val,$key);
    }
    
    array_walk($names, 'fn1');
    
    

    模拟数据结构

    入栈 array_push();
    出栈 array_pop();
    // 每次操作后,索引都会重新索引.

    顶端出: array_shift();
    顶端入: array_unshift();

    排序函数

    soft(); 按照值升序
    rsoft() 按照值降序
    ksoft()按照键升序
    krsoft(); 按照键降序
    // 值排序,不会保留键值关系,而键排序会保留键值关系.
    // 按照值排序,同时保留键值关系.

    asort(); 按照值,升序,保留键值关联.
    arsort(); 按照值,降序,保留键值关联.

    key,键
    reverse(): 反序,默认是升序.
    association: 关联

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》、《php字符串(string)用法总结》、《php常用函数与技巧总结》、《PHP错误与异常处理方法总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》及《PHP数学运算技巧总结》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • PHP数组基本用法与知识点总结
    • php数组指针函数功能及用法示例
    • PHP查找一列有序数组是否包含某值的方法
    • php数组函数array_push()、array_pop()及array_shift()简单用法示例
    • PHP字符串与数组处理函数用法小结
    • PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
    • PHP实现提取多维数组指定一列的方法总结
    • php实现快速对二维数组某一列进行组装的方法小结
    • PHP数组对象与Json转换操作实例分析
    • 如何在PHP中使用数组
    上一篇:ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
    下一篇:Laravel框架源码解析之反射的使用详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PHP 数组操作详解【遍历、指针、函数等】 PHP,数组,操作,详解,遍历,