将阵列移位N并保留原始

时间:2019-03-15 13:36:55

标签: php arrays

我想将数组从O偏移N,我想从O偏移量插入N个新值,并保留原始数组。

我看了array_splice,在php doc的示例中,他们做了我想要的,但是对我来说不起作用。这是我的代码:

function arrayShift(array $array, int $offset, int $length) {
    $insert = [];
    // create new array of $length size
    for ($i = 0; $i < $length; $i++) {
        $insert []= '0';
    }

    return array_splice($array, $offset, 0, $insert);
}

// my array is multidimensionnal with 16 values
$array = [
   0 => [
      'value1' => 'test',
   ],
   .....
];
var_dump(arrayShift($array, 5, 2));
// it returns empty array

我想要这个数组:

array:10 [
  0 => array:3 [
    "type" => "choices"
    "choices" => array:1 []
    "field" => array:3 []
  ]
  1 => array:3 []
  2 => array:3 []
  3 => array:3 []
  4 => array:3 []
  5 => array:3 []
  6 => array:3 []
  7 => array:3 []
  8 => array:3 []
  9 => array:3 []
]

成为这个数组:

array:12 [
  0 => array:3 [
    "type" => "choices"
    "choices" => array:1 []
    "field" => array:3 []
  ]
  1 => array:3 []
  2 => array:3 []
  3 => array:3 []
  4 => array:3 []
  5 => array:3 []
  6 => '0',
  7 => '0',
  8 => array:3 []
  9 => array:3 []
  10 => array:3 []
  11 => array:3 []
]

是因为它是多维数组吗?我认为这不会改变任何事情。

2 个答案:

答案 0 :(得分:1)

array_splice()手册中所述,签名为

  

array_splice(array&$ input,int $ offset [,int $ length = count($ input)[,混合$ replacement = array()]]):数组

请注意,第一个参数是按引用(&$input)。这意味着在调用array_splice()之后,将对$input数组进行更改,而不是对函数调用的结果进行更改。

该函数的返回值是“ 由提取的元素组成的数组。”(来自文档)。对您而言,这将意味着一个空数组-因为您不会删除任何内容($length参数在您的代码中始终设置为0)。

因此,您应该调用该函数,然后返回该数组。

array_splice($array, $offset, 0, $insert);
return $array;

请参见live demo

答案 1 :(得分:1)

array_splice()根据每个函数签名的引用作用于原始数组:

array_splice ( array &$input , int $offset [, int $length = count($input) [, mixed $replacement = array() ]] ) : array
                     ^ the ampersand!

但是它返回一个值数组,该值是您从原始数组中拼接出来的,因此要立即解决问题,您只需将函数更改为:

array_splice($array, $offset, 0, $insert);
return $array;

如果您希望函数的行为类似于array_splice(),则需要将函数签名更改为:

function arrayShift(array &$array, int $offset, int $length) {
    $insert = [];
    // create new array of $length size
    for ($i = 0; $i < $length; $i++) {
        $insert []= '0';
    }

    return array_splice($array, $offset, 0, $insert);
}

,您将像这样使用它:

$array = [
   0 => [
      'value1' => 'test',
   ],
   .....
];

arrayShift($array, 5, 2); // alter $array by reference
var_dump($array);