From 920c0b22f9fe32087aed2c57b6172f66e304eafc Mon Sep 17 00:00:00 2001 From: regular-alves Date: Wed, 16 Sep 2020 17:24:35 -0300 Subject: [PATCH 1/2] fix: multidimensional array params error on rendering of multidimensional array params such as "param[with][array][]" --- src/Tools/Utils.php | 50 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/Tools/Utils.php b/src/Tools/Utils.php index 8be7ecf7..fbc58706 100644 --- a/src/Tools/Utils.php +++ b/src/Tools/Utils.php @@ -130,9 +130,21 @@ public static function printQueryParamsAsString(array $cleanQueryParams): string // List query param (eg filter[]=haha should become "filter[]": "haha") $qs .= "$paramName" . '[]=' . urlencode($value[0]) . '&'; } else { + foreach ($value as $item => $itemValue) { + if(!is_array($itemValue)) + continue; + + $return = self::recursiveItemValue("[$item]", $itemValue); + + unset($value[$item]); + + $value = array_merge($value, $return); + } + // Hash query param (eg filter[name]=john should become "filter[name]": "john") foreach ($value as $item => $itemValue) { - $qs .= "$paramName" . '[' . urlencode($item) . ']=' . urlencode($itemValue) . '&'; + $item = strpos($item, '[')!==false ? str_replace(['%5B', '%5D'], ['[', ']'], urlencode($item)) : '[' . urlencode($item) . ']'; + $qs .= "$paramName" . $item . '=' . urlencode($itemValue) . '&'; } } } @@ -141,6 +153,27 @@ public static function printQueryParamsAsString(array $cleanQueryParams): string return rtrim($qs, '&'); } + private static function recursiveItemValue($item, $item_value) + { + $item_values = []; + + if(is_array($item_value)) { + foreach ($item_value as $key => $value) { + $item_values = array_merge( + $item_values, + self::recursiveItemValue( + sprintf("%s[%s]", $item, $key), + $value + ) + ); + } + }else{ + return [$item => $item_value]; + } + + return $item_values; + } + public static function printQueryParamsAsKeyValue( array $cleanQueryParams, string $quote = "\"", @@ -162,8 +195,21 @@ public static function printQueryParamsAsKeyValue( } else { // Hash query param (eg filter[name]=john should become "filter[name]": "john") foreach ($value as $item => $itemValue) { + if(!is_array($itemValue)) + continue; + + $return = self::recursiveItemValue("[$item]", $itemValue); + + unset($value[$item]); + + $value = array_merge($value, $return); + } + + foreach ($value as $item => $itemValue) { + $item = strpos($item, '[')!==false ? $item : "[$item]"; + $output .= str_repeat(" ", $spacesIndentation); - $output .= "$quote$parameter" . "[$item]$quote$delimiter $quote$itemValue$quote,\n"; + $output .= "$quote$parameter" . "$item$quote$delimiter $quote$itemValue$quote,\n"; } } } From aad86b2cbc81857e25b3d4c99c5004aa8b97c7af Mon Sep 17 00:00:00 2001 From: regular-alves Date: Wed, 16 Sep 2020 17:44:58 -0300 Subject: [PATCH 2/2] fix: code styling --- src/Tools/Utils.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Tools/Utils.php b/src/Tools/Utils.php index fbc58706..0884c748 100644 --- a/src/Tools/Utils.php +++ b/src/Tools/Utils.php @@ -131,8 +131,9 @@ public static function printQueryParamsAsString(array $cleanQueryParams): string $qs .= "$paramName" . '[]=' . urlencode($value[0]) . '&'; } else { foreach ($value as $item => $itemValue) { - if(!is_array($itemValue)) + if (!is_array($itemValue)) { continue; + } $return = self::recursiveItemValue("[$item]", $itemValue); @@ -157,17 +158,17 @@ private static function recursiveItemValue($item, $item_value) { $item_values = []; - if(is_array($item_value)) { + if (is_array($item_value)) { foreach ($item_value as $key => $value) { $item_values = array_merge( - $item_values, + $item_values, self::recursiveItemValue( - sprintf("%s[%s]", $item, $key), + sprintf("%s[%s]", $item, $key), $value ) ); } - }else{ + } else { return [$item => $item_value]; } @@ -195,8 +196,9 @@ public static function printQueryParamsAsKeyValue( } else { // Hash query param (eg filter[name]=john should become "filter[name]": "john") foreach ($value as $item => $itemValue) { - if(!is_array($itemValue)) + if (!is_array($itemValue)) { continue; + } $return = self::recursiveItemValue("[$item]", $itemValue);