Fix #20268: Minor optimisation in \yii\helpers\BaseArrayHelper::map

This commit is contained in:
Christina Reichel
2024-10-27 11:37:09 +01:00
committed by GitHub
parent 25059c4e08
commit e4d5d73490
4 changed files with 75 additions and 15 deletions

View File

@ -9,6 +9,7 @@ Yii Framework 2 Change Log
- Enh #20247: Support for variadic console controller action methods (brandonkelly)
- Bug #20256: Add support for dropping views in MSSQL server when running migrate/fresh (ambrozt)
- Enh #20248: Add support for attaching behaviors in configurations with Closure (timkelty)
- Enh #20268: Minor optimisation in `\yii\helpers\BaseArrayHelper::map` (chriscpty)
2.0.51 July 18, 2024
--------------------

View File

@ -595,6 +595,9 @@ class BaseArrayHelper
*/
public static function map($array, $from, $to, $group = null)
{
if (is_string($from) && is_string($to) && $group === null && strpos($from, '.') === false && strpos($to, '.') === false) {
return array_column($array, $to, $from);
}
$result = [];
foreach ($array as $element) {
$key = static::getValue($element, $from);

View File

@ -313,9 +313,14 @@ class BaseStringHelper
}
if ($skipEmpty) {
// Wrapped with array_values to make array keys sequential after empty values removing
$result = array_values(array_filter($result, function ($value) {
return $value !== '';
}));
$result = array_values(
array_filter(
$result,
function ($value) {
return $value !== '';
}
)
);
}
return $result;
@ -343,7 +348,7 @@ class BaseStringHelper
*/
public static function normalizeNumber($value)
{
$value = (string) $value;
$value = (string)$value;
$localeInfo = localeconv();
$decimalSeparator = isset($localeInfo['decimal_point']) ? $localeInfo['decimal_point'] : null;
@ -396,7 +401,7 @@ class BaseStringHelper
{
// . and , are the only decimal separators known in ICU data,
// so its safe to call str_replace here
return str_replace(',', '.', (string) $number);
return str_replace(',', '.', (string)$number);
}
/**
@ -422,14 +427,14 @@ class BaseStringHelper
$replacements = [
'\\\\\\\\' => '\\\\',
'\\\\\\*' => '[*]',
'\\\\\\?' => '[?]',
'\*' => '.*',
'\?' => '.',
'\[\!' => '[^',
'\[' => '[',
'\]' => ']',
'\-' => '-',
'\\\\\\*' => '[*]',
'\\\\\\?' => '[?]',
'\*' => '.*',
'\?' => '.',
'\[\!' => '[^',
'\[' => '[',
'\]' => ']',
'\-' => '-',
];
if (isset($options['escape']) && !$options['escape']) {
@ -483,7 +488,7 @@ class BaseStringHelper
*/
public static function mb_ucwords($string, $encoding = 'UTF-8')
{
$string = (string) $string;
$string = (string)$string;
if (empty($string)) {
return $string;
}

View File

@ -734,6 +734,57 @@ class ArrayHelperTest extends TestCase
'345' => 'ccc',
],
], $result);
$result = ArrayHelper::map($array,
static function (array $group) {
return $group['id'] . $group['name'];
},
static function (array $group) {
return $group['name'] . $group['class'];
}
);
$this->assertEquals([
'123aaa' => 'aaax',
'124bbb' => 'bbbx',
'345ccc' => 'cccy',
], $result);
$result = ArrayHelper::map($array,
static function (array $group) {
return $group['id'] . $group['name'];
},
static function (array $group) {
return $group['name'] . $group['class'];
},
static function (array $group) {
return $group['class'] . '-' . $group['class'];
}
);
$this->assertEquals([
'x-x' => [
'123aaa' => 'aaax',
'124bbb' => 'bbbx',
],
'y-y' => [
'345ccc' => 'cccy',
],
], $result);
$array = [
['id' => '123', 'name' => 'aaa', 'class' => 'x', 'map' => ['a' => '11', 'b' => '22']],
['id' => '124', 'name' => 'bbb', 'class' => 'x', 'map' => ['a' => '33', 'b' => '44']],
['id' => '345', 'name' => 'ccc', 'class' => 'y', 'map' => ['a' => '55', 'b' => '66']],
];
$result = ArrayHelper::map($array, 'map.a', 'map.b');
$this->assertEquals([
'11' => '22',
'33' => '44',
'55' => '66'
], $result);
}
public function testKeyExists()
@ -759,7 +810,7 @@ class ArrayHelperTest extends TestCase
if (version_compare(PHP_VERSION, '8.1.0', '>=')) {
$this->markTestSkipped('Using floats as array key is deprecated.');
}
$array = [
1 => 3,
2.2 => 4, // Note: Floats are cast to ints, which means that the fractional part will be truncated.