mirror of
https://github.com/yiisoft/yii2.git
synced 2026-03-09 16:57:53 +01:00
Fix #20306: Add new yii\helpers\ArrayHelper::flatten() method
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user