如何更快地制作三重foreach?

时间:2011-02-16 09:52:51

标签: php model-view-controller cakephp view

我有http://pastebin.com/4NYvuaB0这个视图,结果如下:

enter image description here

第一个foreach迭代项目 第二次迭代Hitos(一个项目有一个或多个Hitos) 第三次迭代Tareas(One Hito有零,一个或多个tareas)

它工作正常,但渲染视图大约需要120秒,这太多了!

有人知道如何加快速度吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

你应该限制使用类$ semaforo利用css

更改范围属性,您现在拥有的范围有点令人困惑:

function semColor($p) {
    $semValues = array('rojo','berde','amarillo','naranja','rojo');
    $ranges = array(-1,50,70,100);
    for ($i=0; $i<4;$i++)
        if ($ranges[$i]>$p['desv']) break;
    return $semValues[$i];
}

使用模板创建行

/* use any other method to create the template string */
$templ = '<div class="%s %s"><ul><li class="thmas">&nbsp;<a href="#" class="trigger2">&nbsp;</a></li>'
       . '<li class="'
       . join('">%s&nbsp;</li><li class="', 
             array_merge(array('','th1','th2','th3','th5','th4','th6'),
             array_fill(0,12,'thmes'),
             array('thtotal','thtotal)
       )).'">%s&nbsp;</li></ul></div>';

内部循环的代码变为:

foreach ( $aTareak as $a ) {
   if (($a['proyecto_id']==$h['proyecto_id']) && ($a['hito_id']==$h['hito_id'])) {
      printf($templ, 
         'divtrtarea',
         semColor($a['desv'])
         $a['categoria_nombre'],
         $a['coordinador_nombre'],
         $a['tarea_nombre'],
         $a['total_prev'],
         $a['total_horas'],
         round($a['desv'], 2),
         $a['1'], $a['2'], $a['3'], $a['4'], $a['5'], $a['6'],
         $a['7'], $a['8'], $a['9'], $a['10'], $a['11'], $a['12'],
         array_sum(array_slice($a,1,12)), /* assuming they are consecutive */
         $html->link('Selec.',array(
           'controller'=>'lineas',
           'action'=>'addhoras', 
           $a['proyecto_id'],
           $a['hito_id'],
           $a['tarea_id'])
         )
      );
   }
}

外部的必须相应改变

答案 1 :(得分:0)

目前尚不清楚 $ proiektuak 的来源。

您想一次显示多少行? 如果很多,试着限制它们。

如果我们知道瓶颈出现在哪里,那么建议会更容易。