mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-10-31 10:39:59 +08: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
	 Kairat Jenishev
					Kairat Jenishev