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 相关文章推荐
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
Apr 01 PHP
Thinkphp模板中截取字符串函数简介
Jun 17 PHP
CI框架入门示例之数据库取数据完整实现方法
Nov 05 PHP
PHP+Javascript实现在线拍照功能实例
Jul 18 PHP
浅谈PHP中foreach/in_array的使用
Nov 02 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
Jun 06 PHP
php微信开发之谷歌测距
Jun 14 PHP
laravel Validator ajax返回错误信息的方法
Sep 29 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 PHP
PHP哈希表实现算法原理解析
Dec 11 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
真正的ZIP文件操作类(php)
2007/07/21 PHP
PHP中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
js每隔5分钟执行一次ajax请求的实现方法
2013/11/27 Javascript
Eclipse配置Javascript开发环境图文教程
2015/01/29 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
javascript模块化简单解析
2016/04/07 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
关于express与koa的使用对比详解
2018/01/25 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python pickle模块用法实例
2015/04/14 Python
Python实现登录接口的示例代码
2017/07/21 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
python计算日期之间的放假日期
2018/06/05 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
电大物流学生的自我评价
2013/10/25 职场文书
影视动画专业个人的自我评价
2013/12/31 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript