summaryrefslogtreecommitdiff
path: root/Zend/tests
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2021-01-07 10:49:50 +0100
committerNikita Popov <nikita.ppv@gmail.com>2021-02-09 10:04:27 +0100
commit27cd7a11cb9f0dc9f2a906a659775e221eb87efa (patch)
treebbde3f2bf36779cb5fdda40b39fc6ab95aaf3a8a /Zend/tests
parent3fbd3d2e2f105aa1cb4790af536ca807724fbed0 (diff)
downloadphp-git-27cd7a11cb9f0dc9f2a906a659775e221eb87efa.tar.gz
Add support for string keys in array unpacking
This adds support for: $array1 = ['a' => 1, 'b' => 2]; $array2 = ['b' => 3, 'c' => 4]; $array = [...$array1, ...$array2]; // => ['a' => 1, 'b' => 3, 'c' => 4] RFC: https://wiki.php.net/rfc/array_unpacking_string_keys Closes GH-6584.
Diffstat (limited to 'Zend/tests')
-rw-r--r--Zend/tests/array_unpack/non_integer_keys.phpt4
-rw-r--r--Zend/tests/array_unpack/string_keys.phpt64
-rw-r--r--Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt19
3 files changed, 68 insertions, 19 deletions
diff --git a/Zend/tests/array_unpack/non_integer_keys.phpt b/Zend/tests/array_unpack/non_integer_keys.phpt
index a5e407743c..ab7a20ac86 100644
--- a/Zend/tests/array_unpack/non_integer_keys.phpt
+++ b/Zend/tests/array_unpack/non_integer_keys.phpt
@@ -1,5 +1,5 @@
--TEST--
-Array unpacking does not work with non-integer keys
+Array unpacking does not work with non-integer/string keys
--FILE--
<?php
function gen() {
@@ -15,4 +15,4 @@ try {
?>
--EXPECT--
-Exception: Cannot unpack Traversable with non-integer keys
+Exception: Keys must be of type int|string during array unpacking
diff --git a/Zend/tests/array_unpack/string_keys.phpt b/Zend/tests/array_unpack/string_keys.phpt
index e4cfd77f58..d446e69cab 100644
--- a/Zend/tests/array_unpack/string_keys.phpt
+++ b/Zend/tests/array_unpack/string_keys.phpt
@@ -1,22 +1,58 @@
--TEST--
-array unpacking with string keys (not supported)
+Array unpacking with string keys
--FILE--
<?php
-try {
- $array = [1, 2, "foo" => 3, 4];
- var_dump([...$array]);
-} catch (Error $ex) {
- var_dump($ex->getMessage());
-}
-try {
- $iterator = new ArrayIterator([1, 2, "foo" => 3, 4]);
- var_dump([...$iterator]);
-} catch (Error $ex) {
- var_dump($ex->getMessage());
+// Works with both arrays and Traversables.
+$array = [1, 2, "foo" => 3, 4];
+var_dump([...$array]);
+
+$iterator = new ArrayIterator([1, 2, "foo" => 3, 4]);
+var_dump([...$iterator]);
+
+// Test overwriting behavior.
+$array1 = ["foo" => 1];
+$array2 = ["foo" => 2];
+var_dump(["foo" => 0, ...$array1, ...$array2]);
+var_dump(["foo" => 0, ...$array1, ...$array2, "foo" => 3]);
+
+// Test numeric string key from iterator.
+function gen() {
+ yield "42" => 42;
}
+var_dump([...gen()]);
?>
--EXPECT--
-string(36) "Cannot unpack array with string keys"
-string(42) "Cannot unpack Traversable with string keys"
+array(4) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ ["foo"]=>
+ int(3)
+ [2]=>
+ int(4)
+}
+array(4) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ ["foo"]=>
+ int(3)
+ [2]=>
+ int(4)
+}
+array(1) {
+ ["foo"]=>
+ int(2)
+}
+array(1) {
+ ["foo"]=>
+ int(3)
+}
+array(1) {
+ [0]=>
+ int(42)
+}
diff --git a/Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt b/Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt
index 1401fb9bd5..df58d78a6a 100644
--- a/Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt
+++ b/Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt
@@ -1,10 +1,23 @@
--TEST--
-Unpacking of string keys detected at compile-time
+Unpacking of string keys is supported at compile-time
--FILE--
<?php
var_dump([...['a' => 'b']]);
+var_dump(['a' => 'X', ...['a' => 'b']]);
+var_dump([...['a' => 'b'], 'a' => 'X']);
?>
---EXPECTF--
-Fatal error: Cannot unpack array with string keys in %s on line %d
+--EXPECT--
+array(1) {
+ ["a"]=>
+ string(1) "b"
+}
+array(1) {
+ ["a"]=>
+ string(1) "b"
+}
+array(1) {
+ ["a"]=>
+ string(1) "X"
+}