October 1, 2010

Генерация колонок в таблице

Иногда бывает необходимо динамически построить таблицу по имеющемуся массиву данных.

Проблема заключается в правильной расстановке закрывающего и открывающего тега <tr> таблицы.

Вот мое решение, скажем, для случая трех колонок:


  < ?php $step = 0; ?>
    < ?php $colsPerRow = 3 ?>
    < ?php $stepsCount = sizeof($statuses) ?>
    
  
  
    < ?php foreach ($statuses as $statusKey => $statusName): ?>
        < ?php if (0 == $step%$colsPerRow && (0 < $step)): // insert a new row each $colsPerRow iteration ?>
        
  
    < ?php endif; ?>
        < ?php if (($step + 1) == $stepsCount): ?>
          < ?php $colspan = $colsPerRow - $step%$colsPerRow; ?>
        < ?php endif; ?>
        < ?php // add colspan for last TD element to result with a valid table ?>
        <td colspan="< ?php echo $colspan ?>"< ?php endif;?>>
          < ?php echo checkbox_tag('filters[service_status][' . $statusKey . ']', $statusKey, isset($filters['service_status'][$statusKey])) ?> -
                
    
    
        </td>
        < ?php $step++; // increment the step ?>
      < ?php endforeach; ?>
      
  

Если вы хотите, чтобы последняя ячейка не растягивалась на пустое место через colspan, а достраивалось недостающее число ячеек, то в блоке

< ?php if (($step + 1) == $stepsCount): ?>
  < ?php $colspan = $colsPerRow - $step%$colsPerRow; ?>
< ?php endif; ?>

$colspan нужно еще уменьшить на единицу

и после закрывающего тега </td> добавить блок кода

< ?php if (isset($colspan) && (1 < $colspan)): ?>
    < ?php for ($i=0; $i < $colspan; $i++): ?>
      


   

    < ?php endfor; ?>
  < ?php endif; ?>