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 相关文章推荐
我常用的几个类
Oct 09 PHP
基于mysql的论坛(5)
Oct 09 PHP
用 PHP5 轻松解析 XML
Dec 04 PHP
PHP简单系统查询模块代码打包下载
Jun 07 PHP
Ajax+PHP边学边练 之五 图片处理
Dec 03 PHP
基于Zend的Config机制的应用分析
May 02 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
Jun 18 PHP
thinkphp框架实现删除和批量删除
Jun 29 PHP
php使用高斯算法实现图片的模糊处理功能示例
Nov 11 PHP
Symfony2针对输入时间进行查询的方法分析
Jun 28 PHP
PHP7扩展开发之hello word实现方法详解
Jan 15 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 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输出缓存(output_buffering)的深入理解
2013/06/13 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
2010/10/22 Javascript
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
JS对大量数据进行多重过滤的方法
2016/11/04 Javascript
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
python Django连接MySQL数据库做增删改查
2013/11/07 Python
进一步了解Python中的XML 工具
2015/04/13 Python
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
django-利用session机制实现唯一登录的例子
2020/03/16 Python
区分python中的进程与线程
2020/08/13 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
一些高难度的SQL面试题
2016/11/29 面试题
财务管理专业自荐信范文
2013/12/24 职场文书
课程设计心得体会
2013/12/28 职场文书
顶撞老师检讨书
2014/02/07 职场文书
领导个人查摆剖析材料
2014/10/29 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
保洁员岗位职责
2015/02/04 职场文书
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android