Preciso de ajuda para refatorar esta função para que ela possa efetivamente lidar com fórmulas IF aninhadas.
A função não lida bem com IFs aninhados quando vai mais fundo do que um nível.
public function transformIfStatements(string $formulaText): string
{
$formulaText = preg_replace_callback(
'/IF\(\s*([^,]+)\s*,\s*(IF\([^)]+\)|[^,]+)\s*,\s*(IF\([^)]+\)|[^)]+)\s*\)/',
function ($matches) {
return '(' . trim($matches[1]) . ') ? (' . trim($matches[2]) . ') : (' . trim($matches[3]) . ')';
},
$formulaText
);
return $formulaText;
}
Veja o caso 3 abaixo:
Caso 1:
Entrada :"IF(1>10, "Large", "Medium")"
Saída : "(1>10) ? ("Large") : ("Medium")"
// Válido
Caso 2:
Entrada :"IF(1>10, IF(44>20, "Large", "Medium"), "Small")"
Saída : "(1>10) ? ((44>20) ? ("Large") : ("Medium")) : ("Small")"
// Válido
Caso 3:
Entrada :"IF(1>10, IF(44>20, "Large", IF(4<5, "Tiny", "Medium")), "Small")"
Saída : "(1>10) ? ((44>20) : ("Large") ? ((4<5) : ("Tiny") ? ("Medium"))) : ("Small")"
// Inválido
Nota :
"IF(A1>10, IF(A1>20, "Large", IF(A1<5, "Tiny", "Medium")), "Small")" would be a more realistic input. The inputs in above test cases were used for the sake of simplicity.
Desde já, obrigado!