如何更快地进行三重 foreach?

Posted

技术标签:

【中文标题】如何更快地进行三重 foreach?【英文标题】:How can I make a triple foreach faster? 【发布时间】:2011-02-16 09:52:50 【问题描述】:

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

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

工作正常,但是渲染视图需要大约 120 秒,太长了!

有人知道如何让它更快吗?

提前致谢。

【问题讨论】:

我首先建议使用 smarty 等模板系统。而不是你将代码与 html 分开......这将使事情变得更简单。还有一个问题是:目前速度有多快?测量结果? 如果您希望其他人阅读您的文章,请用英文命名所有内容(类、函数、变量、cmets)。到目前为止,我自己并不是一个以英语为母语的人,但就像医生用拉丁语命名事物一样,我们用英语命名事物。不是出于审美原因,而是让其他人也有机会阅读它。 @khmarbaise:带有 php 的 CakePHP 视图是一个模板系统。您当然可以通过将逻辑放入其中来错误地使用它。没有必要在 PHP 中使用模板,因为 PHP 代码可以插入到 HTML 模板中。 【参考方案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'])
         )
      );
   

外部的必须相应改变

【讨论】:

非常感谢!这很有帮助!【参考方案2】:

不清楚$proiektuak从何而来。

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

如果我们知道瓶颈出现在哪里,提供建议会容易得多。

【讨论】:

$proiektuak 是我在控制器上填充的一个数组。瓶颈正在呈现此视图.. 花费了很多时间,但没有什么可以限制的,因为我需要所有行

以上是关于如何更快地进行三重 foreach?的主要内容,如果未能解决你的问题,请参考以下文章

R mclapply vs foreach

如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别

如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别

如何在 C++ 中进行耗时的三重组合 [关闭]

Parallel.Foreach在幕后做了什么?

为什么线程比Parallel.Foreach更快打开OracleConnection?