parentId map if needed. * * @param array $data Passed by reference; parentId modified in place. * @param array $parentMap Map of fieldIndex => newly created parent field id. */ public static function resolveParentId(array &$data, array $parentMap): void { if (!array_key_exists('parentId', $data)) { return; } $parentId = $data['parentId']; $needsResolve = ($parentId === 0 || $parentId === '0' || $parentId === null); if ($needsResolve && isset($data['fieldIndex']) && isset($parentMap[$data['fieldIndex']])) { $data['parentId'] = $parentMap[$data['fieldIndex']]; } } /** * Partition field options into new, update, and submitted IDs. * * @param array $fieldData * @param array $existingOptionIds * @return array{ * newOptions: array, * updateOptions: array, * submittedOptionIds: array * } * @throws ValidationException */ public static function partitionFieldOptions(array $fieldData, array $existingOptionIds): array { $newOptions = []; $updateOptions = []; $submittedOptionIds = []; foreach ($fieldData['fieldOptions'] as $optionData) { $option = FieldOptionsFactory::create($optionData); if ( isset($optionData['id']) && $optionData['id'] > 0 && in_array($optionData['id'], $existingOptionIds, true) ) { $updateOptions[] = $option; $submittedOptionIds[] = $optionData['id']; continue; } $newOptions[] = $option; } return [ 'newOptions' => $newOptions, 'updateOptions' => $updateOptions, 'submittedOptionIds' => $submittedOptionIds, ]; } }