diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2021-01-07 10:49:50 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2021-02-09 10:04:27 +0100 |
commit | 27cd7a11cb9f0dc9f2a906a659775e221eb87efa (patch) | |
tree | bbde3f2bf36779cb5fdda40b39fc6ab95aaf3a8a /Zend/tests | |
parent | 3fbd3d2e2f105aa1cb4790af536ca807724fbed0 (diff) | |
download | php-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.phpt | 4 | ||||
-rw-r--r-- | Zend/tests/array_unpack/string_keys.phpt | 64 | ||||
-rw-r--r-- | Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt | 19 |
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" +} |