Amigo:
Estube algo "ocupado" pero aca te dejo la solucion... todos hacemos algo parecido..... se basa en usar el operador modulo (%) de la division:
Código PHP:
Ver original<?php
// registros de consulta SQL simulada:
array('id'=>2,'img'=>'xxxxxxx.jpg'), array('id'=>3,'img'=>'lalala.jpg'), array('id'=>42,'img'=>'blabla.jpg'), array('id'=>334,'img'=>'xxxxxxx.jpg'), array('id'=>555,'img'=>'xxxxxxx.jpg'), array('id'=>560,'img'=>'xxxxxxx.jpg'), array('id'=>700,'img'=>'xxxxxxx.jpg'), array('id'=>704,'img'=>'xxxxxxx.jpg'), array('id'=>708,'img'=>'xxxxxxx.jpg'), array('id'=>709,'img'=>'xxxxxxx.jpg'), array('id'=>710,'img'=>'xxxxxxx.jpg'), array('id'=>811,'img'=>'xxxxxxx.jpg'), array('id'=>912,'img'=>'xxxxxxx.jpg'), array('id'=>913,'img'=>'xxxxxxx.jpg'),
);
y ahora... el programa:
Código PHP:
Ver original<?php
$close=null;
$cols= 3; // cols de la tabla
?>
<table width="90%" id="tabnovedades">
<?php foreach ((array) $datos as $i => $dato): ?> <?php if ($i%$cols==0): ?>
<tr>
<?php endif; $close = $i+$cols; ?>
<td>
<a href="http://xxx.com/path?id=<?= $dato['id']; ?>">
<img src="http://xxx.com/path/<?= $dato['img']; ?>" alt=""/>
</a>
</td>
<?php if ($i==$close): ?>
</tr>
<?php endif; ?>
<?php
endforeach;
// cierro la ultima columna si se que no se pudo hacer en el bucle
echo '</tr>';
?>
</table>
He hecho esto mil veces... de distintas formas pero creo esta puede ser la mas simple...
Este mismo algoritmo sirve para con DIVs y nota que el PHP no ha interrumpido para nada el HTML... si un diseñador te entrega una plantilla en HTML deberias hacer algo asi...... ni PHP ni Javascript deben ser invasivos