我想将数组从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 []
]
是因为它是多维数组吗?我认为这不会改变任何事情。
答案 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);