电子商务|3分钟短文 | PHP 数组任意位置插入新元素,你是怎么处理的?

电子商务|3分钟短文 | PHP 数组任意位置插入新元素,你是怎么处理的?

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



学习时间
标准的实现方法 , 是要用 array_splice , 该函数的用法:
array array_splice( array &$input int $offset[ int $length = 0[ mixed $replacement

)

把input数组中由offset和length指定的单元去掉 , 如果提供了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数组 , 则被移除的单元被此数组中的单元替代 。
  • 如果offset和length的组合结果是不会移除任何值 , 则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 :_)
【电子商务|3分钟短文 | PHP 数组任意位置插入新元素,你是怎么处理的?】我是@程序员小助手 , 持续分享编程知识 , 欢迎关注 。


    推荐阅读