I'm trying to insert into an array at a certain point:
$hi = "test";
$var2 = "next";
$arr = array(&$hi);
$arr[] = &$var2; // this works
array_splice($arr, 1, 0, &$var2); // this doesn't
Why does trying to insert it into the array with splice fail and using the first method doesn't?
The quick-and-dirty answer, but please be aware that calling this function with a reference is deprecated and may (depending on your php configuration) generate a warning:
array_splice($arr, 1, 0, array(&$var2));
The hows-and-whys answer: What's happening is pretty subtle. When you do the splice, because you have inserted a reference into that position, $var2 is actually being reassigned. You can verify it with the following code:
<?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));
?>
You will get the following result:
=== var2 before splice:
'next'
=== var2 after splice:
array (
0 => 'next',
)
Notice that before the splice, $var2 was a string, just as you expected it to be ('next'). After the splice, though, $var2 has been replaced with an array containing one element, the string 'next'.
I think what's causing it is what the documentation says: "If replacement is not an array, it will be typecast to one (i.e. (array) $parameter)." So what is happening is this:
I'm not sure exactly all of the wizardry of what's happening internally, but $var is definitely being reassigned during the splice. Notice that if you use a third variable, since it's not assigning something to something that already exists as a reference, it works as expected:
<?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));
?>
Generates the result:
=== arr is now
array (
0 => 'test',
1 => 'last',
2 => 'next',
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With