У меня есть две таблицы БД следующим образом:
Таблица категорий
--- ID --- Name -- GroupID
1 Cat 1 0
2 Cat 2 0
3 Side 1 1
4 Side 2 1
Таблица продуктов
--- ID --- Name – CatID – CatID2
1 P1 1 3
2 P2 1 4
3 P4 2 3
4 P3 2 4
5 P5 1 4
На основании приведенной выше таблицы я бы вывел в следующем формате:
Образец вывода:
Cat 1 Cat 2
Side 1 P1 P4
Side 2 P2,P5 P3
Я не уверен, что структура таблицы неправильная, я могу получить список категорий и продуктов, но я не уверен, как вывести приведенную выше таблицу.
здесь решение, которое я придумал, я упустил базу данных, чтобы сделать ее проще.
Данные это жестко закодированные массивы:
$cats = array(
array(
'id' => 1,
'name' => 'cat 1 '
),array(
'id' => 2,
'name' => 'cat 2 '
),array(
'id' => 3,
'name' => 'cat 3 '
)
);$side = array(
array(
'id' => 5,
'name' => 'side 1 '
),array(
'id' => 4,
'name' => 'side 2 '
),array(
'id' => 6,
'name' => 'side 3 '
)
);$products = array(
array(
'id' => 5,
'name' => 'p1',
'cat' => 1,
'side' => 6,
),array(
'id' => 5,
'name' => 'p2',
'cat' => 1,
'side' => 6,
),array(
'id' => 6,
'name' => 'p3',
'cat' => 2,
'side' => 5,
),array(
'id' => 7,
'name' => 'p4',
'cat' => 2,
'side' => 6,
)
);
Затем эта функция используется для поиска как в cat, так и в боковых массивах и проверки соответствия продукта.
function search_p($array, $key, $value, $key2, $value2)
{
$results = array();
if (is_array($array) ) {
if (isset($array[$key]) && $array[$key] == $value && isset($array[$key2]) && $array[$key2] == $value2) {
$results[] = $array;
}
foreach ($array as $subarray) {
$results = array_merge($results, search_p($subarray, $key, $value,$key2, $value2));
}
}
return $results;
}
Чтобы вывести таблицу, я сделал следующее:
<table>
<tr>
<th></th>
<?php
foreach($cats AS $c){
echo '<th>'.$c['name'].'</th>';
}
?>
</tr>
<?php
foreach($side AS $a){
echo '<tr><td>'.$a['name'].'</td>';
foreach($cats AS $c){
echo '<td>';
$p = search_p($products, 'cat', $c['id'], 'side', $a['id']);
foreach($p AS $pc){
echo '-- '.$pc['name'].' -- ';
}
echo '</td>';
}
echo '</tr>';
}
?>
</table>
Других решений пока нет …