El inconveninente esta aca:
Código PHP:
$claart = $compras[$compra]['claart'];
$claemp = $compras[$compra]['claemp'];
$cantidad = $compras[$compra]['cantidad'];
$fecha = $compras[$compra]['fecha'];
Lo estas llamando como si fuese un array de array. Creo que lo logico, dependendiendo de como te devuelva los datos $bd->consulta, seria algo como:
Código PHP:
$claart = $compras['claart'];
$claemp = $compras['claemp'];
$cantidad = $compras['cantidad'];
$fecha = $compras['fecha'];
Y en cuanto a los del FOR y Foreach, concuerdo con David, no vale la pena ese tipo de optimizacion, tenes que realizar codigo sencillo y siempre de mantener, y en tu caso utilizaria un foreach, por ahi eso es lo que te esta dando a confucion.
Espero haber ayudado.
Saludos