$field) || trim((string) $user->$field) === '') return false; } return preg_match('/^1\d{10}$/', (string) $user->mobile) && filter_var(trim($user->email), FILTER_VALIDATE_EMAIL) && User::hasCompleteBirthday((string) $user->birthday); } public static function respondent(?User $user, $data, $snapshot): array { $result = []; foreach (self::DISPLAY_FIELDS as $field) $result[$field] = $user->$field ?? null; $map = SurveySchema::answerMap($data); $snapshot = SurveySchema::arrayValue($snapshot); $questions = SurveySchema::arrayValue($snapshot['questions'] ?? array_values($map)); $keyed = ($snapshot['version'] ?? 0) >= 2; foreach ($questions as $q) { $q['config'] = SurveySchema::arrayValue($q['config'] ?? []); $field = $q['config']['user_field'] ?? null; if (!in_array($field, self::DISPLAY_FIELDS, true)) continue; if (is_scalar($result[$field]) && trim((string) $result[$field]) !== '') continue; $answer = $map[(string) ($q['id'] ?? '')] ?? []; if (!empty($answer['hidden']) || !SurveySchema::visible($q, $questions, $map, $keyed)) continue; $value = $answer['value'] ?? null; if (is_scalar($value) && trim((string) $value) !== '') $result[$field] = trim((string) $value); } return $result; } }