Fix #20306: Add new yii\helpers\ArrayHelper::flatten() method

This commit is contained in:
Kairat Jenishev
2025-01-06 20:53:58 +06:00
committed by GitHub
parent 3fc7e71c67
commit f94017ce4c
6 changed files with 452 additions and 49 deletions

View File

@ -1610,6 +1610,125 @@ class ArrayHelperTest extends TestCase
],
];
}
public function testFlatten()
{
// Test with deeply nested arrays
$array = [
'a' => [
'b' => [
'c' => [
'd' => 1,
'e' => 2,
],
'f' => 3,
],
'g' => 4,
],
'h' => 5,
];
$expected = [
'a.b.c.d' => 1,
'a.b.c.e' => 2,
'a.b.f' => 3,
'a.g' => 4,
'h' => 5,
];
$this->assertEquals($expected, ArrayHelper::flatten($array));
// Test with arrays containing different data types
$array = [
'a' => [
'b' => [
'c' => 'string',
'd' => 123,
'e' => true,
'f' => null,
],
'g' => [1, 2, 3],
],
];
$expected = [
'a.b.c' => 'string',
'a.b.d' => 123,
'a.b.e' => true,
'a.b.f' => null,
'a.g.0' => 1,
'a.g.1' => 2,
'a.g.2' => 3,
];
$this->assertEquals($expected, ArrayHelper::flatten($array));
// Test with arrays containing special characters in keys
$array = [
'a.b' => [
'c.d' => [
'e.f' => 1,
],
],
'g.h' => 2,
];
$expected = [
'a.b.c.d.e.f' => 1,
'g.h' => 2,
];
$this->assertEquals($expected, ArrayHelper::flatten($array));
// Test with custom separator
$array = [
'a' => [
'b' => [
'c' => [
'd' => 1,
'e' => 2,
],
'f' => 3,
],
'g' => 4,
],
'h' => 5,
];
$result = ArrayHelper::flatten($array, '_');
$expected = [
'a_b_c_d' => 1,
'a_b_c_e' => 2,
'a_b_f' => 3,
'a_g' => 4,
'h' => 5,
];
$this->assertEquals($expected, $result);
}
public function testFlattenEdgeCases()
{
// Empty array
$array = [];
$expected = [];
$this->assertEquals($expected, ArrayHelper::flatten($array));
// Non-array value
$array = 'string';
$expected = ['string'];
$this->expectException('yii\base\InvalidArgumentException');
$this->expectExceptionMessage('Argument $array must be an array or implement Traversable');
$this->assertEquals($expected, ArrayHelper::flatten($array));
// Special characters in keys
$array = ['a.b' => ['c.d' => 1]];
$expected = ['a.b.c.d' => 1];
$this->assertEquals($expected, ArrayHelper::flatten($array));
// Mixed data types
$array = ['a' => ['b' => 'string', 'c' => 123, 'd' => true, 'e' => null]];
$expected = ['a.b' => 'string', 'a.c' => 123, 'a.d' => true, 'a.e' => null];
$this->assertEquals($expected, ArrayHelper::flatten($array));
// Key collisions
$array = ['a' => ['b' => 1], 'a.b' => 2];
$expected = ['a.b' => 2];
$this->assertEquals($expected, ArrayHelper::flatten($array));
}
}
class Post1