From 10ad8d65c4635aa793a16bd17931e693c028a531 Mon Sep 17 00:00:00 2001 From: Smuuf Date: Sat, 13 Jul 2019 13:12:07 +0200 Subject: [PATCH] Fixed string_shuffle function for unicode characters. --- src/extensions/psl/StringExtension.php | 15 ++++++++++++++- tests/unit/value.string.phpt | 7 +++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/extensions/psl/StringExtension.php b/src/extensions/psl/StringExtension.php index 2cf45642..f3739338 100644 --- a/src/extensions/psl/StringExtension.php +++ b/src/extensions/psl/StringExtension.php @@ -15,7 +15,20 @@ class StringExtension extends Extension { public static function string_shuffle(StringValue $str): StringValue { - return new StringValue(str_shuffle((string) $str->value)); + + // str_shuffle() doesn't work with unicode, so let's do this ourselves. + $original = $str->value; + $length = mb_strlen($original); + $indices = range(0, $length - 1); + shuffle($indices); + $result = ""; + + while (($i = array_pop($indices)) !== null) { + $result .= mb_substr($original, $i, 1); + } + + return new StringValue($result); + } public static function string_length(StringValue $str): NumberValue { diff --git a/tests/unit/value.string.phpt b/tests/unit/value.string.phpt index 89d57c5c..63f247e1 100644 --- a/tests/unit/value.string.phpt +++ b/tests/unit/value.string.phpt @@ -252,6 +252,13 @@ Assert::same(2, get_val($fns['string_number_of']->invoke([$string, new StringVal Assert::same(0, get_val($fns['string_number_of']->invoke([$string, new StringValue("xoxoxo")]))); Assert::same(0, get_val($fns['string_number_of']->invoke([$string, new NumberValue(1)]))); +// +// Test shuffle. +// + +Assert::same(17, mb_strlen(get_val($fns['string_shuffle']->invoke([$string])))); +Assert::same(17, mb_strlen(get_val($fns['string_shuffle']->invoke([$unicode])))); + // // Test length. //