diff --git a/NEWS b/NEWS index 6f96a91ea90..879d07d8655 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,9 @@ PHP NEWS - FPM: . Added listen.setfib pool option to set route FIB on FreeBSD. (David Carlier) +- Standard: + . Fixed empty array returned by str_split on empty input. (Michael Vorisek) + 07 Jul 2022, PHP 8.2.0alpha3 - Core: diff --git a/UPGRADING b/UPGRADING index 7eb9f7edd6a..24ce2513daa 100644 --- a/UPGRADING +++ b/UPGRADING @@ -45,6 +45,7 @@ PHP 8.2 UPGRADE NOTES stripos, strripos, lcfirst, ucfirst, ucwords, str_ireplace, array_change_key_case and sorting with SORT_FLAG_CASE use ASCII case conversion. + . str_split no longer returns an empty array on empty string. - SPL: . The following methods now enforce their signature: diff --git a/ext/standard/string.c b/ext/standard/string.c index 37347c2bce5..e247b4b08f5 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -5885,7 +5885,11 @@ PHP_FUNCTION(str_split) RETURN_THROWS(); } - if (0 == ZSTR_LEN(str) || (size_t)split_length >= ZSTR_LEN(str)) { + if ((size_t)split_length >= ZSTR_LEN(str)) { + if (0 == ZSTR_LEN(str)) { + RETURN_EMPTY_ARRAY(); + } + array_init_size(return_value, 1); add_next_index_stringl(return_value, ZSTR_VAL(str), ZSTR_LEN(str)); return; diff --git a/ext/standard/tests/strings/str_split_basic.phpt b/ext/standard/tests/strings/str_split_basic.phpt index ce0f1004c7a..86bf2884642 100644 --- a/ext/standard/tests/strings/str_split_basic.phpt +++ b/ext/standard/tests/strings/str_split_basic.phpt @@ -16,7 +16,11 @@ var_dump( str_split($str,$split_length) ); echo "-- With split_length as default argument --\n"; var_dump( str_split($str) ); -echo "Done" +echo "-- Empty string must always return empty array --\n"; +var_dump( str_split('') ); +var_dump( str_split('', 1) ); +var_dump( str_split('', 100) ); + ?> --EXPECT-- *** Testing str_split() : basic functionality *** @@ -80,4 +84,10 @@ array(22) { [21]=> string(1) "e" } -Done +-- Empty string must always return empty array -- +array(0) { +} +array(0) { +} +array(0) { +} diff --git a/ext/standard/tests/strings/str_split_variation3.phpt b/ext/standard/tests/strings/str_split_variation3.phpt index 7003d62eaa1..53a78244c56 100644 --- a/ext/standard/tests/strings/str_split_variation3.phpt +++ b/ext/standard/tests/strings/str_split_variation3.phpt @@ -39,9 +39,7 @@ echo "Done" --EXPECTF-- *** Testing str_split() : double quoted strings for 'str' *** -- Iteration 1 -- -array(1) { - [0]=> - string(0) "" +array(0) { } -- Iteration 2 -- array(1) { diff --git a/ext/standard/tests/strings/str_split_variation4.phpt b/ext/standard/tests/strings/str_split_variation4.phpt index b10fd0c7d9e..c3c71bd0c52 100644 --- a/ext/standard/tests/strings/str_split_variation4.phpt +++ b/ext/standard/tests/strings/str_split_variation4.phpt @@ -38,9 +38,7 @@ echo "Done" --EXPECT-- *** Testing str_split() : single quoted strings for 'str' *** -- Iteration 1 -- -array(1) { - [0]=> - string(0) "" +array(0) { } -- Iteration 2 -- array(1) { diff --git a/ext/standard/tests/strings/str_split_variation5.phpt b/ext/standard/tests/strings/str_split_variation5.phpt index 02c7d61eb13..656bcad7d1a 100644 --- a/ext/standard/tests/strings/str_split_variation5.phpt +++ b/ext/standard/tests/strings/str_split_variation5.phpt @@ -81,14 +81,10 @@ echo "Done" --EXPECT-- *** Testing str_split() : heredoc strings as 'str' argument *** -- Iteration 1 -- -array(1) { - [0]=> - string(0) "" +array(0) { } -- Iteration 2 -- -array(1) { - [0]=> - string(0) "" +array(0) { } -- Iteration 3 -- array(1) {