Немного сложно разобрать, не зная больше о ваших данных.Например, почему таблица «короткого» кредита открыта и закрыта с записью, а таблица «длинного» кредита является условной для предыдущей записи?Это потому, что у вас плоская структура данных, поэтому связанные данные отображаются в виде последовательности последовательных строк?Если бы это было так, то было бы проще, если бы данные были немного более нормализованы.Т.е. вы можете перебирать каждую кредитную запись, а затем отдельно детали.Есть ли возможность исправить вашу структуру данных?
Анализируя ваш код, ваша проблема заключается в логике для второго раздела кода.Вы устанавливаете значение переменной $oldvalue
в конце цикла.Это после логики, которая закрывает таблицу.Поэтому, если вы проанализируете две записи с одинаковым заголовком категории, вторая запись выведет свои строки таблицы полностью за пределы таблицы (не говоря уже о том, что в ней также будет совершенно пустая строка).Кроме того, если у вас короткий тип кредита после длинного, таблица никогда не будет закрыта.
При этом, работая с тем, что у вас есть, я предполагаю, что вам может понадобиться что-то вроде следующего:
// build a dummy "previous" record for the first iteration so the conditionals don't break.
<?php $previous_credit = array('credit_type'=>null,'category'=>null); ?>
<?php foreach($credits as $credit) : ?>
<?php if($credit['credit_type'] == "short" || ($previous_credit['credit_type'] == "long" && $previous_credit['category'] != $credit['category'])) : ?>
</tbody>
</table>
<?php endif; ?>
<?php if($credit['credit_type'] == "short") : ?>
<table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:0px 0px 15px 0px;">
<tr>
<td><strong><?php echo $credit['category_title']; ?></strong></td>
</tr>
<tr>
<td><?php echo $credit['credit_heading']; ?></td>
</tr>
</table>
<?php endif; ?>
<?php if($credit['credit_type'] == "long") : ?>
<?php if($credit['category_title'] != $previous_credit['category_title']) : ?>
<table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:0px 0px 15px 0px;">
<tbody>
<tr>
<td width="25%"><strong><?php echo trim($credit['category_title']); ?></strong></td>
<td width="25%"><strong>Title</strong></td>
<td width="25%"><strong>Role</strong></td>
<td width="25%"><strong>Director</strong></td>
</tr>
<?php endif; ?>
<tr>
<td width="25%"><?php echo $credit['credit_heading'];?></td>
<td width="25%"><?php echo $credit['credit_title']; ?></td>
<td width="25%"><?php echo $credit['credit_role']; ?></td>
<td width="25%"><?php echo $credit['credit_director']; ?></td>
</tr>
<?php endif; ?>
<?php $previous_credit = $credit; ?>
<?php endforeach; ?>
<!-- one last table close for the last record -->
</tbody></table>
(Это какой-то уродливый код, и у меня нет времени его пересматривать, так что ... вики сообщества, если кто-то еще захочет его почистить.)