22
33namespace Nuxtifyts \PhpDto \Support ;
44
5+ use BackedEnum ;
6+ use InvalidArgumentException ;
7+
58final readonly class Arr
69{
710 /**
811 * @param array<array-key, mixed> $array
9- * @param string $key
1012 * @param array<array-key, mixed> $default
1113 *
1214 * @return array<array-key, mixed>
@@ -30,4 +32,165 @@ public static function isArrayOfClassStrings(array $array, string $classString):
3032 && is_subclass_of ($ value , $ classString )
3133 );
3234 }
35+
36+ /**
37+ * @param array<array-key, mixed> $array
38+ */
39+ public static function getStringOrNull (array $ array , string $ key ): ?string
40+ {
41+ $ value = $ array [$ key ] ?? null ;
42+
43+ return is_string ($ value ) ? $ value : null ;
44+ }
45+
46+ /**
47+ * @param array<array-key, mixed> $array
48+ */
49+ public static function getString (array $ array , string $ key , string $ default = '' ): string
50+ {
51+ return self ::getStringOrNull ($ array , $ key ) ?? $ default ;
52+ }
53+
54+ /**
55+ * @param array<array-key, mixed> $array
56+ */
57+ public static function getIntegerOrNull (array $ array , string $ key ): ?int
58+ {
59+ $ value = $ array [$ key ] ?? null ;
60+
61+ return is_int ($ value ) ? $ value : null ;
62+ }
63+
64+ /**
65+ * @param array<array-key, mixed> $array
66+ */
67+ public static function getInteger (array $ array , string $ key , int $ default = 0 ): int
68+ {
69+ return self ::getIntegerOrNull ($ array , $ key ) ?? $ default ;
70+ }
71+
72+ /**
73+ * @param array<array-key, mixed> $array
74+ */
75+ public static function getFloatOrNull (array $ array , string $ key ): ?float
76+ {
77+ $ value = $ array [$ key ] ?? null ;
78+
79+ return is_float ($ value ) ? $ value : null ;
80+ }
81+
82+ /**
83+ * @param array<array-key, mixed> $array
84+ */
85+ public static function getFloat (array $ array , string $ key , float $ default = 0.0 ): float
86+ {
87+ return self ::getFloatOrNull ($ array , $ key ) ?? $ default ;
88+ }
89+
90+ /**
91+ * @param array<array-key, mixed> $array
92+ */
93+ public static function getBooleanOrNull (array $ array , string $ key ): ?bool
94+ {
95+ $ value = $ array [$ key ] ?? null ;
96+
97+ return is_bool ($ value ) ? $ value : null ;
98+ }
99+
100+ /**
101+ * @param array<array-key, mixed> $array
102+ */
103+ public static function getBoolean (array $ array , string $ key , bool $ default = false ): bool
104+ {
105+ return self ::getBooleanOrNull ($ array , $ key ) ?? $ default ;
106+ }
107+
108+ /**
109+ * @template T of BackedEnum
110+ *
111+ * @param array<array-key, mixed> $array
112+ * @param class-string<T> $enumClass
113+ * @param ?T $default
114+ *
115+ * @return ?T
116+ */
117+ public static function getBackedEnumOrNull (
118+ array $ array ,
119+ string $ key ,
120+ string $ enumClass ,
121+ ?BackedEnum $ default = null
122+ ): ?BackedEnum {
123+ $ value = $ array [$ key ] ?? null ;
124+
125+ if ($ value instanceof $ enumClass ) {
126+ return $ value ;
127+ } else if (
128+ (is_string ($ value ) || is_integer ($ value ))
129+ && $ resolvedValue = $ enumClass ::tryFrom ($ value )
130+ ) {
131+ return $ resolvedValue ;
132+ }
133+
134+ return is_null ($ default )
135+ ? null
136+ : ($ default instanceof $ enumClass
137+ ? $ default
138+ : throw new InvalidArgumentException ('Default value must be an instance of ' . $ enumClass )
139+ );
140+ }
141+
142+ /**
143+ * @template T of BackedEnum
144+ *
145+ * @param array<array-key, mixed> $array
146+ * @param class-string<T> $enumClass
147+ * @param T $default
148+ *
149+ * @return T
150+ */
151+ public static function getBackedEnum (
152+ array $ array ,
153+ string $ key ,
154+ string $ enumClass ,
155+ BackedEnum $ default
156+ ): BackedEnum {
157+ return self ::getBackedEnumOrNull ($ array , $ key , $ enumClass , $ default ) ?? $ default ;
158+ }
159+
160+
161+ /**
162+ * @param array<array-key, mixed> $array
163+ *
164+ * @return ($preserveKeys is true ? array<array-key, mixed> : list<mixed>)
165+ */
166+ public static function flatten (array $ array , float $ depth = INF , bool $ preserveKeys = true ): array
167+ {
168+ $ result = [];
169+
170+ foreach ($ array as $ key => $ item ) {
171+ $ item = $ item instanceof Collection ? $ item ->all () : $ item ;
172+
173+ if (! is_array ($ item )) {
174+ if ($ preserveKeys ) {
175+ $ result [$ key ] = $ item ;
176+ } else {
177+ $ result [] = $ item ;
178+ }
179+ } else {
180+ $ values = $ depth === 1.0
181+ ? $ item
182+ : self ::flatten ($ item , $ depth - 1 , $ preserveKeys );
183+
184+ foreach ($ values as $ subKey => $ value ) {
185+ if ($ preserveKeys ) {
186+ $ result [$ subKey ] = $ value ;
187+ } else {
188+ $ result [] = $ value ;
189+ }
190+ }
191+ }
192+ }
193+
194+ return $ result ;
195+ }
33196}
0 commit comments