<?php

$operations = explode("\n", file_get_contents('input.txt'));

$results = [];
foreach ($operations as $i => $operation) {
    $operation = evaluateParentheses($operation);
    $operation = evaluateOperation($operation);
    $results[] = (int) $operation;
    echo sprintf('Line %u : %u%s', $i+1, $operation, "\n");
}

echo array_sum($results);
/**
 * @param string $operation
 *
 * @return false|float|int
 * @throws \Exception
 */
function evaluateOperation(string $operation)
{
    while (!is_numeric($operation)) {
        $original_operation = $operation;
        $operation = preg_replace_callback(
            '/(\d+) \+ (\d+)/',
            static function ($matches) {
                return (int)$matches[1] + (int)$matches[2];
            },
            $operation
        );

        if ($original_operation === $operation) {
            $operation = preg_replace_callback(
                '/(\d+) \* (\d+)/',
                static function ($matches) {
                    return (int)$matches[1] * (int)$matches[2];
                },
                $operation
            );
        }
    }

    return $operation;
}

function evaluateParentheses($operation)
{
    $result = preg_replace_callback('/\(([^\)\(]+)\)/', static function ($matches) {
        return evaluateOperation($matches[1]);
    }, $operation);

    if ($result === $operation || $result === null) {
        return $operation;
    }

    return evaluateParentheses($result);
}