To solve this optimization problem and provide the required output in both symbolic representation and Gurobi code, let's break down the components of the problem first.

The variables are:
- Hamburgers (x1)
- Peanutbutter sandwiches (x2)

Resources/Attributes:
- Dollar cost for hamburgers: $17 each
- Dollar cost for peanutbutter sandwiches: $3 each
- Sourness index for hamburgers: 18
- Sourness index for peanutbutter sandwiches: 1

Objective Function:
Minimize 7*x1 + 8*x2

Constraints:
1. Total dollar cost is at least $84.
2. The sourness index total is at least 19.
3. Four times the number of hamburgers minus nine times the number of peanutbutter sandwiches is at least zero.
4. The total dollar cost does not exceed $158.
5. The total combined sourness index from hamburgers and peanutbutter sandwiches is less than or equal to 93.

Now, let's express this problem in symbolic notation:

```json
{
    'sym_variables': [('x1', 'hamburgers'), ('x2', 'peanutbutter sandwiches')],
    'objective_function': '7*x1 + 8*x2',
    'constraints': [
        '17*x1 + 3*x2 >= 84',
        '18*x1 + 1*x2 >= 19',
        '4*x1 - 9*x2 >= 0',
        '17*x1 + 3*x2 <= 158',
        '18*x1 + 1*x2 <= 93'
    ]
}
```

Given the nature of the problem, which involves linear constraints and a linear objective function, this is a Linear Programming (LP) problem. The variables x1 and x2 are allowed to be non-integer, making it appropriate for LP.

Here's how you can model and solve this problem using Gurobi in Python:

```python
from gurobipy import *

# Create a new model
model = Model("Optimization_Problem")

# Add variables: hamburgers (x1) and peanutbutter sandwiches (x2)
x1 = model.addVar(lb=0, vtype=GRB.CONTINUOUS, name="hamburgers")
x2 = model.addVar(lb=0, vtype=GRB.CONTINUOUS, name="peanutbutter_sandwiches")

# Set the objective function: Minimize 7*x1 + 8*x2
model.setObjective(7*x1 + 8*x2, GRB.MINIMIZE)

# Add constraints
model.addConstr(17*x1 + 3*x2 >= 84, name="total_cost_min")
model.addConstr(18*x1 + 1*x2 >= 19, name="sourness_index_min")
model.addConstr(4*x1 - 9*x2 >= 0, name="hamburgers_vs_sandwiches")
model.addConstr(17*x1 + 3*x2 <= 158, name="total_cost_max")
model.addConstr(18*x1 + 1*x2 <= 93, name="sourness_index_max")

# Optimize the model
model.optimize()

# Check if an optimal solution was found
if model.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"hamburgers: {x1.x}, peanutbutter sandwiches: {x2.x}")
    print(f"Objective function value: {model.objVal}")
else:
    print("No optimal solution found")
```