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 相关文章推荐
40个迹象表明你还是PHP菜鸟
Sep 29 PHP
ThinkPHP php 框架学习笔记
Oct 30 PHP
php 中文和编码判断代码
May 16 PHP
javascript 小型动画组件与实现代码
Jun 02 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
Nov 10 PHP
实用的简单PHP分页集合包括使用方法
Oct 21 PHP
dedecms中使用php语句指南
Nov 13 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
Adnroid 微信内置浏览器清除缓存
Jul 11 PHP
php版微信公众平台开发之验证步骤实例详解
Sep 23 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 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 中dirname(_file_)讲解
2007/03/18 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
跟我学Laravel之视图 &amp; Response
2014/10/15 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
PHP如何将XML转成数组
2016/04/04 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
JS实现随机数生成算法示例代码
2013/08/08 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
JavaScript学习心得之概述
2015/01/20 Javascript
JS实现很酷的EMAIL地址添加功能实例
2015/02/28 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
JavaScript计算出两个数的差值
2020/03/19 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
python使用any判断一个对象是否为空的方法
2014/11/19 Python
python中zip()方法应用实例分析
2016/04/16 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
python和ruby,我选谁?
2017/09/13 Python
更新pip3与pyttsx3文字语音转换的实现方法
2019/08/08 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
Python使用微信接入图灵机器人过程解析
2019/11/04 Python
python单例设计模式实现解析
2020/01/07 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
ET Mall东森购物网:东森严选
2017/03/06 全球购物
Clarks鞋法国官方网站:英国其乐鞋品牌
2018/02/11 全球购物
感恩节活动策划方案
2014/05/16 职场文书
工作失职检讨书500字
2014/10/17 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书