$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)) { $operation = preg_replace_callback( '/^(\d+) (\+|\*) (\d+)/', static function ($matches) { switch ($matches[2]) { case '+': return (int)$matches[1] + (int)$matches[3]; case '*': return (int)$matches[1] * (int)$matches[3]; default: throw new \Exception('Unknown Operation ' . var_export($matches, true)); } }, $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); }