我想在某个点插入一个数组:
$hi = "test";
$var2 = "next";
$arr = array(&$hi);
$arr[] = &$var2; // this works
array_splice($arr, 1, 0, &$var2); // this doesn't
Run Code Online (Sandbox Code Playgroud)
为什么尝试将它插入到数组中并且使用第一种方法并没有使用第一种方法?
快速而肮脏的答案,但请注意,不推荐使用引用调用此函数,并且可能(取决于您的php配置)生成警告:
array_splice($arr, 1, 0, array(&$var2));
Run Code Online (Sandbox Code Playgroud)
这个怎么样的回答:发生的事情非常微妙.当您进行拼接时,因为您已将引用插入到该位置,所以实际上正在重新分配$ var2.您可以使用以下代码进行验证:
<?php
$hi = "test";
$var2 = "next";
$arr = array(&$hi);
$arr[] = &$var2; // this works
printf("=== var2 before splice:\n%s\n", var_export($var2, TRUE));
array_splice($arr, 1, 0, &$var2); // this doesn't
printf("=== var2 after splice:\n%s\n", var_export($var2, TRUE));
?>
Run Code Online (Sandbox Code Playgroud)
您将获得以下结果:
=== var2 before splice:
'next'
=== var2 after splice:
array (
0 => 'next',
)
Run Code Online (Sandbox Code Playgroud)
请注意,在拼接之前,$ var2是一个字符串,就像您预期的那样('next').但是,在拼接之后,$ var2已经被包含一个元素的数组替换,字符串'next'.
我认为导致它的原因是文档说:"如果替换不是数组,它将被一个类型(即(数组)$参数)强制转换." 所以发生的事情是这样的:
我不确定内部发生的所有内容,但是$ var肯定会在拼接过程中被重新分配.请注意,如果您使用第三个变量,因为它不会将某些内容分配给已作为引用存在的内容,它会按预期工作:
<?php
$hi = "test";
$var2 = "next";
$var3 = "last";
$arr = array(&$hi);
$arr[] = &$var2; // this works
array_splice($arr, 1, 0, &$var3);
printf("=== arr is now\n%s\n", var_export($arr, TRUE));
?>
Run Code Online (Sandbox Code Playgroud)
生成结果:
=== arr is now
array (
0 => 'test',
1 => 'last',
2 => 'next',
)
Run Code Online (Sandbox Code Playgroud)