no hay mucho para cambiarle a ese codigo, lo que puedes hacer es paginar los dos foreach interiores.
lo que yo haria es un banchmark a ese codigo para ver donde esta el cuello de botella real. en modo local el webGrind es muy util ya que te identificara con precicion el codigo que mas demora, sino puedes optar por una clase asi (o una mas sofisticada):
Código PHP:
Ver original<?php
class simpleBench
{
private $tiempos = array();
public function initPoint($nombre)
{
}
public function endPoint($nombre)
{
$this->tiempos[$nombre] = microtime(true)-$this->tiempos[$nombre]; }
public function dumpBench($nombre = '')
{
}
}
$miBench = new simpleBench();
?>
para ver que es lo que demora, primero la usas sobre el primer foreach, luego sobre el segundo y luego sobre el tercero.