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 Ajax实现页面无刷新发表评论
Jan 02 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
解析thinkphp中的导入文件标签
Jun 20 PHP
php cli换行示例
Apr 22 PHP
PHP英文字母大小写转换函数小结
May 03 PHP
PHP模拟asp中response类实现方法
Aug 08 PHP
yii数据库的查询方法
Dec 28 PHP
php日期操作技巧小结
Jun 25 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
PHP判断表达式中括号是否匹配的简单实例
Oct 22 PHP
python进程与线程小结实例分析
Nov 11 PHP
PHP预定义接口――Iterator用法示例
Jun 05 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
PHP Mysql编程之高级技巧
2008/08/27 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
2017/11/28 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
js实现多选项切换导航菜单的方法
2015/02/06 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
盘点javascript 正则表达式中 中括号的【坑】
2016/03/16 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
python动态进度条的实现代码
2019/07/03 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
英国最大的电子零件及配件零售商:Partmaster
2017/04/24 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
建筑工程专业毕业生自荐信
2013/10/19 职场文书
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
模范教师事迹材料
2014/02/10 职场文书
婚前保证书
2014/04/29 职场文书
基层党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
python如何做代码性能分析
2021/04/26 Python
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android