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语言中global和$GLOBALS[]的分析 之二
Feb 02 PHP
Fine Uploader文件上传组件应用介绍
Jan 06 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
Jul 15 PHP
在SAE上搭建最新wordpress的方法
Dec 21 PHP
php实现中文字符截取防乱码方法汇总
Apr 29 PHP
PHP数组实例详解
Jun 26 PHP
比较完整的微信开发php代码
Aug 02 PHP
php中static 静态变量和普通变量的区别
Dec 01 PHP
PHP面向对象程序设计方法实例详解
Dec 24 PHP
PHP生成指定范围内的N个不重复的随机数
Mar 18 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
Sep 02 PHP
基于PHP实现邮箱验证激活过程详解
Oct 28 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/06/07 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
js带点自动图片轮播幻灯片特效代码分享
2015/09/07 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
JS对象与json字符串相互转换实现方法示例
2018/06/14 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
python中csv文件的若干读写方法小结
2018/07/04 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
python matplotlib imshow热图坐标替换/映射实例
2020/03/14 Python
python使用建议与技巧分享(二)
2020/08/17 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
简单的辞职信范文
2014/01/18 职场文书
青年教师培训方案
2014/02/06 职场文书
群众路线个人整改方案
2014/10/25 职场文书
离婚协议书范文
2015/01/26 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android