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 相关文章推荐
二十行语句实现从Excel到mysql的转化
Oct 09 PHP
php不用正则采集速度探究总结
Mar 24 PHP
删除数组元素实用的PHP数组函数
Aug 18 PHP
PHP6 先修班 JSON实例代码
Aug 23 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
PHP对象转换为数组函数(递归方法)
Feb 04 PHP
Joomla简单判断用户是否登录的方法
May 04 PHP
php实现当前页面点击下载文件的简单方法
Sep 22 PHP
简述php环境搭建与配置
Dec 05 PHP
laravel 验证错误信息到 blade模板的方法
Sep 29 PHP
Laravel-添加后台模板AdminLte的实现方法
Oct 08 PHP
PHPstorm激活码2020年5月13日亲测有效
Sep 17 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
crontab无法执行php的解决方法
2016/01/25 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
JavaScript操作表单实例讲解(上)
2016/06/20 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
微信小程序中如何使用flyio封装网络请求
2019/07/03 Javascript
python读写ini文件示例(python读写文件)
2014/03/25 Python
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
Django封装交互接口代码
2020/07/12 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
HTML5 LocalStorage 本地存储刷新值还在
2017/03/10 HTML / CSS
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
上课说话检讨书大全
2014/01/22 职场文书
公司面试感谢信
2014/02/01 职场文书
后勤主管岗位职责
2014/03/01 职场文书
企业安全生产责任书
2014/04/14 职场文书
小学感恩主题班会
2015/08/12 职场文书
小学大队委竞选口号
2015/12/25 职场文书
高中生社会实践心得体会
2016/01/14 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
Pygame Time时间控制的具体使用详解
2021/11/17 Python
Python中super().__init__()测试以及理解
2021/12/06 Python
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js