To solve this optimization problem, we first need to translate the natural language description into a symbolic representation. This involves defining variables, an objective function, and constraints using mathematical notation.

Let's define the variables as follows:
- $x_1$ represents the quantity of oreos.
- $x_2$ represents the quantity of bagged salads.
- $x_3$ represents the quantity of peanutbutter sandwiches.

The objective function to maximize is given by:
\[ 2.58x_1 + 8.22x_2 + 5.51x_3 \]

Now, let's define the constraints based on the problem description:

1. Each oreo contains 11 milligrams of iron.
2. Each bagged salad contains 6 milligrams of iron.
3. Each peanutbutter sandwich contains 3 milligrams of iron.
4. No more than 180 milligrams of iron from bagged salads and peanutbutter sandwiches combined: $6x_2 + 3x_3 \leq 180$.
5. No more than 75 milligrams of iron from oreos and peanutbutter sandwiches combined: $11x_1 + 3x_3 \leq 75$.
6. No more than 90 milligrams of iron from oreos and bagged salads combined: $11x_1 + 6x_2 \leq 90$.
7. No more than 90 milligrams of iron from all three items combined: $11x_1 + 6x_2 + 3x_3 \leq 90$.
8. $x_1$ and $x_2$ must be integers (non-fractional number of oreos and whole number of bagged salads), but $x_3$ can be any real number.

The symbolic representation in JSON format is:

```json
{
    'sym_variables': [('x1', 'oreos'), ('x2', 'bagged salads'), ('x3', 'peanutbutter sandwiches')],
    'objective_function': '2.58*x1 + 8.22*x2 + 5.51*x3',
    'constraints': [
        '11*x1 + 6*x2 + 3*x3 <= 90',
        '6*x2 + 3*x3 <= 180',
        '11*x1 + 3*x3 <= 75',
        '11*x1 + 6*x2 <= 90'
    ]
}
```

To solve this problem using Gurobi, we will write the following Python code:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="oreos")
x2 = m.addVar(vtype=GRB.INTEGER, name="bagged_salads")
x3 = m.addVar(vtype=GRB.CONTINUOUS, name="peanutbutter_sandwiches")

# Set the objective function
m.setObjective(2.58*x1 + 8.22*x2 + 5.51*x3, GRB.MAXIMIZE)

# Add constraints
m.addConstr(11*x1 + 6*x2 + 3*x3 <= 90, name="total_iron_constraint")
m.addConstr(6*x2 + 3*x3 <= 180, name="salads_sandwiches_iron_constraint")
m.addConstr(11*x1 + 3*x3 <= 75, name="oreos_sandwiches_iron_constraint")
m.addConstr(11*x1 + 6*x2 <= 90, name="oreos_salads_iron_constraint")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Oreos: {x1.x}")
    print(f"Bagged Salads: {x2.x}")
    print(f"Peanutbutter Sandwiches: {x3.x}")
    print(f"Objective Function Value: {m.objVal}")
else:
    print("No optimal solution found.")
```