$data * @return array */ public static function deep(array $data): array { $clean = []; foreach ($data as $key => $value) { $key = is_string($key) ? sanitize_text_field($key) : $key; if (is_array($value)) { $clean[$key] = self::deep($value); } elseif (is_scalar($value) || $value === null) { $clean[$key] = $value === null ? null : sanitize_text_field((string) $value); } // Objects/resources are dropped — never trust them from input. } return $clean; } /** * Sanitize an array against a map of field => type rules. * Fields absent from $rules default to text; fields in $rules but absent * from $data are skipped. * * @param array $data * @param array $rules * @return array */ public static function fields(array $data, array $rules = []): array { $clean = []; foreach ($data as $key => $value) { $type = $rules[$key] ?? 'text'; if (is_array($value)) { $clean[$key] = self::deep($value); } else { $clean[$key] = self::value($value, $type); } } return $clean; } }