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如何编写易读的代码
Jul 10 PHP
php pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
PHP实现AES256加密算法实例
Sep 22 PHP
php批量删除cookie的简单实现方法
Jan 26 PHP
ThinkPHP连接Oracle数据库
Apr 22 PHP
Yii2框架BootStrap样式的深入理解
Nov 07 PHP
深入浅出讲解:php的socket通信原理
Dec 03 PHP
php安装dblib扩展,连接mssql的具体步骤
Mar 02 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
Dec 21 PHP
PHP explode()函数用法讲解
Feb 15 PHP
laravel 框架执行流程与原理简单分析
Feb 01 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
Aug 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
php 正则匹配函数体
2009/08/25 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
php类的定义与继承用法实例
2015/07/07 PHP
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
JS中BOM相关知识点总结(必看篇)
2016/11/22 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
[01:10:16]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第一局
2016/02/27 DOTA
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
Python实现的knn算法示例
2018/06/14 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
2020/07/14 Python
python解包概念及实例
2021/02/17 Python
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
大学毕业生推荐信
2014/07/09 职场文书
远程培训的心得体会
2014/09/01 职场文书
捐助感谢信
2015/01/22 职场文书
仓管员岗位职责
2015/02/03 职场文书
青岛导游词
2015/02/12 职场文书
岗位职责范本大全
2015/02/26 职场文书
2015年财政局工作总结
2015/05/21 职场文书
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫