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开发的一些注意点总结
Oct 12 PHP
php判断正常访问和外部访问的示例
Feb 10 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 PHP
php绘制一个扇形的方法
Jan 24 PHP
PHP实现简单的新闻发布系统实例
Jul 28 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
Jul 31 PHP
php实现购物车功能(下)
Jan 05 PHP
Lumen timezone 时区设置方法(慢了8个小时)
Jan 20 PHP
PHP实现的大文件切割与合并功能示例
Apr 10 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
Aug 21 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
Oct 03 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中Closure类的使用方法及详解
2015/10/09 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
jquery 获取json数据实现代码
2009/04/27 Javascript
取得窗口大小 兼容所有浏览器的js代码
2011/08/09 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
详解node中创建服务进程
2017/05/09 Javascript
Centos6.8下Node.js安装教程
2017/05/12 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
学习Python列表的基础知识汇总
2020/03/10 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
畜牧兽医本科生个人的自我评价
2013/10/11 职场文书
男方父母证婚词
2014/01/12 职场文书
有创意的广告词
2014/03/18 职场文书
职业生涯规划书结束语
2014/04/15 职场文书
放飞梦想演讲稿600字
2014/08/26 职场文书
重点工程汇报材料
2014/08/27 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
先进学校事迹材料
2014/12/30 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
郭明义电影观后感
2015/06/08 职场文书
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS