Ну смотрите, там таблица, значит колонок должно быть одинаковое количество. Посему лучше на каждый товар создать свою табличку ибо кол-во выбранных опций может быть разное + внизу общую для total
1. Берем массив $product
2. Создаем таблицу и выводим td по кол-ву цикла задавая названия. Типо такого:
<table>
<tr>
<td><?php echo $column_product; ?></td>
<td><?php echo $column_price; ?></td>
<?php foreach ($product['option'] as $product_option) {
echo '<td class="text-left">'.$product_option['name']</td>';
} ?>
</tr>
<tr>
<td><?php echo $product['name']; ?></td>
<td><?php echo $product['price']; ?></td>
<?php foreach ($product['option'] as $product_option) {
echo '<td class="text-left">'.$product_option['value']</td>';
} ?>
</tr>
</table>
3. Добавляем остальные элементы (я 2 добавил, цена и название) и остальные по вкусу + проверки на пустоту)
Как-то так) Набросал без теста, чисто по памяти блоков, но суть думаю понята
Опции не сортируются. Если хотите задать свою сортировку, добавьте ее в getOrderOptions