diff --git a/src/Curl/ArrayUtil.php b/src/Curl/ArrayUtil.php index babd2b7..e618657 100644 --- a/src/Curl/ArrayUtil.php +++ b/src/Curl/ArrayUtil.php @@ -83,27 +83,36 @@ class ArrayUtil if (empty($array)) { $return[$prefix] = ''; } else { + $arrays_to_merge = []; + foreach ($array as $key => $value) { if (is_scalar($value)) { if ($prefix) { - $return[$prefix . '[' . $key . ']'] = $value; + $arrays_to_merge[] = [ + $prefix . '[' . $key . ']' => $value, + ]; } else { - $return[$key] = $value; + $arrays_to_merge[] = [ + $key => $value, + ]; } } elseif ($value instanceof \CURLFile) { - $return[$key] = $value; + $arrays_to_merge[] = [ + $key => $value, + ]; } elseif ($value instanceof \CURLStringFile) { - $return[$key] = $value; + $arrays_to_merge[] = [ + $key => $value, + ]; } else { - $return = array_merge( - $return, - self::arrayFlattenMultidim( - $value, - $prefix ? $prefix . '[' . $key . ']' : $key - ) + $arrays_to_merge[] = self::arrayFlattenMultidim( + $value, + $prefix ? $prefix . '[' . $key . ']' : $key ); } } + + $return = array_merge($return, ...$arrays_to_merge); } } elseif ($array === null) { $return[$prefix] = $array; diff --git a/tests/PHPCurlClass/ArrayUtilTest.php b/tests/PHPCurlClass/ArrayUtilTest.php index e501b2d..e2561a4 100644 --- a/tests/PHPCurlClass/ArrayUtilTest.php +++ b/tests/PHPCurlClass/ArrayUtilTest.php @@ -9,7 +9,7 @@ class ArrayUtilTest extends \PHPUnit\Framework\TestCase { public function testArrayAssociative() { - $this->assertTrue(\Curl\ArrayUtil::isArrayAssoc([ + $this->assertTrue(ArrayUtil::isArrayAssoc([ 'foo' => 'wibble', 'bar' => 'wubble', 'baz' => 'wobble', @@ -18,7 +18,7 @@ class ArrayUtilTest extends \PHPUnit\Framework\TestCase public function testArrayIndexed() { - $this->assertFalse(\Curl\ArrayUtil::isArrayAssoc([ + $this->assertFalse(ArrayUtil::isArrayAssoc([ 'wibble', 'wubble', 'wobble', @@ -30,4 +30,61 @@ class ArrayUtilTest extends \PHPUnit\Framework\TestCase $array = new CaseInsensitiveArray(); $this->assertTrue(ArrayUtil::isArrayAssoc($array)); } + + public function testArrayFlattenMultidimArray() + { + $data = array( + 'key-1' => 'value-1', + 'key-2' => 'value-2', + 'key-3' => [ + 'nested-key-1' => 'nested-value-1', + 'nested-key-2' => 'nested-value-2', + 'nested-key-3' => [ + 'nested-more-key-1' => 'nested-more-value-1', + 'nested-more-key-2' => 'nested-more-value-2', + ], + ], + ); + + $this->assertEquals([ + 'key-1' => 'value-1', + 'key-2' => 'value-2', + 'key-3[nested-key-1]' => 'nested-value-1', + 'key-3[nested-key-2]' => 'nested-value-2', + 'key-3[nested-key-3][nested-more-key-1]' => 'nested-more-value-1', + 'key-3[nested-key-3][nested-more-key-2]' => 'nested-more-value-2', + ], ArrayUtil::arrayFlattenMultidim($data)); + } + + public function testArrayFlattenMultidimOrdering() + { + $data = [ + 'foo' => 'bar', + 'baz' => [ + 'qux' => [ + ], + 'wibble' => 'wobble', + ], + ]; + + $result = ArrayUtil::arrayFlattenMultidim($data); + + // Avoid using assertEquals() as it isn't strict about ordering: + // $this->assertEquals([ + // 'foo' => 'bar', + // 'baz[qux]' => '', + // 'baz[wibble]' => 'wobble', + // ], ArrayUtil::arrayFlattenMultidim($data)); + + $result_keys = array_keys($result); + $result_values = array_values($result); + + $this->assertEquals('foo', $result_keys[0]); + $this->assertEquals('baz[qux]', $result_keys[1]); + $this->assertEquals('baz[wibble]', $result_keys[2]); + + $this->assertEquals('bar', $result_values[0]); + $this->assertEquals('', $result_values[1]); + $this->assertEquals('wobble', $result_values[2]); + } }