引言

接着我们这个系列的文章说。本文我们聊一聊 PHP 数组,如何在任意位置插入新元素。因为内置函数并没有提供类似 array_insert(&$array, $pos, $items) 的函数,所以我们试着动手解决。

学习时间

标准的实现方法,是要用 array_splice,该函数的用法:

array array_splice( array &$input, int $offset[, int $length = 0[, mixed $replacement]] )

input 数组中由 offsetlength 指定的单元去掉,如果提供了 replacement 参数,则用其中的单元取代。

下面是举例说明:

$original = array( 'a', 'b', 'c', 'd', 'e' );
$inserted = array( 'x' ); // $inserted 并不必须是数组array_splice( $original, 3, 0, $inserted ); // 在索引 3 位置插入
// $original 内容为 a b c x d e

有几个关键点大家需要注意,灵活运用 $offset, $length, $replacement 三个参数,可以组装成强大的功能。

对于偏移位置 $offset:

  • 如果 offset 为正,则从 input 数组中该值指定的偏移量开始移除。
  • 如果 offset 为负,则从 input 末尾倒数该值指定的偏移量开始移除。

对于替换的长度 $length:

  • 如果省略 length,则移除数组中从 offset 到结尾的所有部分。
  • 如果指定了 length 并且为正值,则移除这么多单元。
  • 如果指定了 length并且为负值,则移除从 offset 到数组末尾倒数length 为止中间所有的单元。

在编程中,当给出了replacement 时要移除从 offset 到数组末尾所有单元时,用 count($input) 作为 length。比如像下面这个示例:

$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, count($input), "orange");
// $input = array("red", "orange")

特别需要注意的是 $replacement 参数:

  • 如果给出了 replacement 数组,则被移除的单元被此数组中的单元替代。
  • 如果 offsetlength 的组合结果是不会移除任何值,则 replacement 数组中的单元将被插入到 offset 指定的位置。 注意替换数组中的键名不保留
  • 如果用来替换 replacement 只有一个单元,那么不需要给它加上array(),除非该单元本身就是一个数组、一个对象或者 NULL

亲手造轮子

上一节的解决方案堪称标准。有些同学还是要忍不住造轮子。“条条大道通罗马”,肯定有不止一种方式实现需求。下面是另外一种方式:

$a = array(1, 2, 3, 4);
$b = array_merge(array_slice($a, 0, 2), array(5), array_slice($a, 2));
// $b = array(1, 2, 5, 3, 4)

使用 array_slice 函数对原数组切片,一分为二,然后使用 array_merge 拼接3个部分。完美!

上面的代码,在使用 array_merge 后悔丢失原数组的索引关系。如果要保留,使用 + 连接:

$b = array_slice($a, 0, 2) + array(5) + array_slice($a, 2);

这样就可以了。

换汤不换药,如果给类添加一个方法,或者添加一个助手函数,自然是极好的。下面是封装函数。

function array_insert(&$array, $value, $index)
{return $array = array_merge(array_splice($array, max(0, $index - 1)), array($value), $array);
}

写在最后

本文介绍了一个功能丰富的 array_splice 函数,让大家领略了参数的灵活运用所带来的便捷。如果你经常需要这样的操作,麻溜地写到全局助手函数里吧。

Happy coding :_)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

input位置_3分钟短文 | PHP 数组任意位置插入新元素,你是怎么处理的?相关推荐

  1. 移除数组第一个元素_3分钟短文 | PHP 数组删除元素,忘了foreach吧,有更优雅的方式...

    引言 PHP的数组,说白了就是一个映射的键值对集合.那么如何从数组元素中删除元素呢?你肯定首先想到遍历数组,然后找到目标项,然后删除. 我看到有同学将要删除的元素 = null,这并不起作用,因为 n ...

  2. 接口怎么获取数组底下的数组_3分钟短文 | PHP数组获取最后一个元素,10个方式中哪个有错?...

    引言 我们对于 PHP 的数组操作乐此不疲,为什么?因为 PHP 编程你几乎时时刻刻都在于数组打交道,对于数组的操作熟练程度,很大一部分因素关系着代码的优劣. 今天我们来说说,如何获取数组的最后一个元 ...

  3. php 元素插入数组指定位置,数组任意位置插入元素,删除特定元素的实例

    如下所示: $ary = array( array('t'=>1,'y'=>2), array('t'=>2,'y'=>9) ); $t = array_splice( $ar ...

  4. go 数组任意位置插入数字类型的元素

    // 任意位置插入数字类型的元素 // @param slice []int 将指定元素插入的切片 // @param num int 指定元素 // @param index int 插入的指定位置 ...

  5. C# 数组增加元素_C语言数组——任意位置插入一个元素

    前言 接着昨天的话题,我们再来看看向C语言的数组中随机插入一个元素的方法. 如果是在python向列表中随机添加元素,我们往往使用insert()的方法. l insert()的第一个参数是位置,第二 ...

  6. php 二维数组根据键值合并二维数组_3分钟短文 | PHP 根据值移除数组元素,哪个方法最简单?...

    引言 PHP 数组操作,之前我们讲了如何根据值,进行多维数组的排序.今天说一说,如何根据值,进行数组元素的删除. 学习时间 假设有一个一维数组,单纯的数字数组.为了简化问题,我们假设数组元素没有重复项 ...

  7. laravel $request 多维数组取值_3分钟短文:Laravel的“南天门”,过滤掉七七八八的数据...

    引言 上一章我们教会大家如何从用户表单内正确地获取数据,可是没有讲,获取到的数据到底有啥用,或者说,有的用户提交的数据压根儿就没正经填,那些错乱无效的数据,如果直接放到数据库,纯粹是对数据库的污染. ...

  8. laravel $request 多维数组取值_3分钟短文 | Laravel 内3种数据校验的写法,你喜欢哪一个?...

    引言 web应用程序公开访问几乎没有不带用户交互的,难免要接收用户输入的奇奇怪怪的东西.对于后端程序,必须对输入的内容进行有效性过滤. 这就是本文的重点,说一说laravel中输入请求的校验. 学习时 ...

  9. html尾部代码_3分钟短文:Laravel Form,让你不再写 HTML 的好“库”

    引言 作为后端工程师的你,是不是面对一堆JS,CSS感觉无比抓狂.如果能摆脱大量的冗余的HTML代码块, 那该多好啊.laravel作为扩展性极强的框架,自然是为广大后端开发者赋能. 本文我们讲一个简 ...

最新文章

  1. android 弹幕时间戳,【存档】B站直播数据包分析连载(2018-12-11更新/2020-04-12废止)...
  2. connect time out 获取token失败_Power Query之获取钉钉日志自动刷新Power BI报告
  3. Eclipse上GIT插件EGIT使用手册之五_查看历史记录
  4. hadoop相关随记
  5. Swift中文教程(七) 闭包
  6. Think in Java第四版 读书笔记7第13章 字符串
  7. bat执行java程序的脚本解析
  8. ios把数据传递到另一个页面_iOS页面跳转及数据传递(三种)
  9. linux 重启mysql_Grafana+Prometheus 监控 MySql服务
  10. 怎么在html页面添加qq临时会话
  11. Python移植MATLAB的巴特沃斯滤波器,椭圆滤波器
  12. 【C语言】井字棋游戏
  13. 阿里云和域名怎么备案?
  14. openCV获取和修改像素值
  15. java模拟usb接口_Java练习:一个简单的USB接口程序设计
  16. 2022年Google I/O 大会即将举行,可领取 2022 年 I/O 大会参会开发者资料徽章。
  17. python 获取项目根目录
  18. 魔法阵c语言课程设计,魔法阵真的存在吗?
  19. qgjsfagafgpjqip
  20. 这6部韩国电影你都看过吗?

热门文章

  1. 编译安装httpd,并启动之
  2. 怎样用调用资源管理器explore.exe打开指定的文件夹
  3. 【论文写作】毕业论文写作的基本流程
  4. python get sheet_Python模块学习 - openpyxl
  5. predicate 列存储索引扫描_MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!
  6. eas库存状态调整单不能反审核_把握 商品 周转,做好 动态 库存 管理
  7. 农业大学计算机论文,农业大学毕业论文范文
  8. 基于机器视觉的玻璃Mark点字符识别
  9. 图像处理系统概述(白皮书)
  10. 通过HTTP的HEADER完成各种骚操作