php中array_slice和array_splice函数解析


Posted in PHP onOctober 18, 2016

本文主要介绍了php中array_slice和array_splice函数,感兴趣的可以围观一下,

array_slice和array_splice函数是用在取出数组的一段切片,array_splice还有用新的切片替换原删除切片位置的功能。类似javascript中的Array.prototype.splice和Array.prototype.slice方法。

array_slice

array array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]] )

返回数组中指定下标offset和长度length的子数组切片。

参数说明
设第一个参数数组的长度为num_in。

offset

如果offset是正数且小于length,则返回数组会从offset开始;如果offset大于length,则不操作,直接返回。如果offset是负数,则offset = num_in+offset,如果num_in+offset == 0,则将offset设为0。

length

如果length小于0,那么会将length转为num_in - offset + length;否则,如果offset+length > array_count,则length = num_in - offset。如果处理后length还是小于0,则直接返回。

preserve_keys

默认是false,默认不保留数字键值原顺序,设为true的话会保留数组原来的数字键值顺序。

使用实例

<?php
$input = array("a", "b", "c", "d", "e");

$output = array_slice($input, 2);   // returns "c", "d", and "e"
$output = array_slice($input, -2, 1); // returns "d"
$output = array_slice($input, 0, 3);  // returns "a", "b", and "c"

print_r(array_slice($input, 2, -1)); // array(0 => 'c', 1 => 'd');
print_r(array_slice($input, 2, -1, true)); // array(2 => 'c', 1 => 'd');

运行步骤

  • 处理参数:offset、length
  • 移动指针到offset指向的位置
  • 从offset开始,拷贝length个元素到返回数组

运行流程图如下

php中array_slice和array_splice函数解析

array_splice

array array_splice ( array &$input , int $offset [, int $length = 0 [, mixed $replacement = array() ]] )

删除input中从offset开始length个元素,如果有replacement参数的话用replacement数组替换删除掉的元素。

参数说明

 array_splice函数中的offset和length参数跟array_slice函数中的用法一样。

replacement

  • 如果这个参数设置了,那么函数将使用replacement数组来替换。
  • 如果offset和length指定了没有任何元素需要移除,那么replacement会被插入到offset的位置。
  • 如果replacement只有一个元素,可以不用array()去包着它。

使用示例

<?php
$input = array("red", "green", "blue", "yellow");
array_splice($input, 2);
// $input变为 array("red", "green")

$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, -1);
// $input变为 array("red", "yellow")

$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, count($input), "orange");
// $input变为 array("red", "orange")

$input = array("red", "green", "blue", "yellow");
array_splice($input, -1, 1, array("black", "maroon"));
// $input为 array("red", "green",
//     "blue", "black", "maroon")

$input = array("red", "green", "blue", "yellow");
array_splice($input, 3, 0, "purple");
// $input为 array("red", "green",
//     "blue", "purple", "yellow");

源码解读

 在array_splice中,有这么一段代码:

/* Don't create the array of removed elements if it's not going
   * to be used; e.g. only removing and/or replacing elements */
  if (return_value_used) { // 如果有用到函数返回值则创建返回数组,否则不创建返回数组
    int size = length;

    /* Clamp the offset.. */
    if (offset > num_in) {
      offset = num_in;
    } else if (offset < 0 && (offset = (num_in + offset)) < 0) {
      offset = 0;
    }

    /* ..and the length */
    if (length < 0) {
      size = num_in - offset + length;
    } else if (((unsigned long) offset + (unsigned long) length) > (unsigned) num_in)     {
      size = num_in - offset;
    }

    /* Initialize return value */
    array_init_size(return_value, size > 0 ? size : 0);
    rem_hash = &Z_ARRVAL_P(return_value);
  }

array_splice函数返回的是被删除的切片。这段代码的意思是,如果array_splice需要返回值,那么才创建返回数组,否则不创建,以免浪费空间。这也是一个编程小技巧,仅当需要的时候才返回。比如在函数中使用$result = array_splice(...),那么return_value_used就是true。

总结

到此本文结束,在平时编程中,应当像这两个函数实现时的做法一样,将最特殊的情况先处理掉,然后再继续,以免做了多余的判断;有需要保存新变量的时候才申请新的空间,不然会造成浪费。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
php获得文件扩展名三法
Nov 25 PHP
Zend Studio 实用快捷键一览表(精心整理)
Aug 10 PHP
浅析PHP文件下载原理
Dec 25 PHP
PHP四种基本排序算法示例
Apr 09 PHP
PHP经典面试题之设计模式(经常遇到)
Oct 15 PHP
教你php如何实现验证码
Jan 20 PHP
基于php编程规范(详解)
Aug 17 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
详解php协程知识点
Sep 21 PHP
Smarty模板配置实例简析
Jul 20 PHP
基于PHP实现生成随机水印图片
Dec 09 PHP
Yii框架中jquery表单验证插件用法示例
Oct 18 #PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 #PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
Oct 18 #PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
Oct 18 #PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 #PHP
Yii针对添加行的增删改查操作示例
Oct 18 #PHP
Yii遍历行下每列数据的方法
Oct 17 #PHP
You might like
使用PHPMyAdmin修复论坛数据库的图文方法
2012/01/09 PHP
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
phalcon框架使用指南
2016/02/23 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
jquery 页面全选框实践代码
2010/04/02 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
python实用代码片段收集贴
2015/06/03 Python
python从入门到精通(DAY 3)
2015/12/20 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
基于python实现名片管理系统
2018/11/30 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
Python类的动态绑定实现原理
2020/03/21 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
什么是python的必选参数
2020/06/21 Python
python如何建立全零数组
2020/07/19 Python
公司综合部的成员自我评价分享
2013/11/05 职场文书
面试复试通知单
2015/04/24 职场文书
赞助商致辞
2015/07/30 职场文书
安全教育主题班会教案
2015/08/12 职场文书
初中教务主任竞聘演讲稿(范文)
2019/08/20 职场文书
Python Matplotlib绘制条形图的全过程
2021/10/24 Python
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js