如何更快地进行三重 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"> <a href="#" class="trigger2"> </a></li>'
. '<li class="'
. join('">%s </li><li class="',
array_merge(array('','th1','th2','th3','th5','th4','th6'),
array_fill(0,12,'thmes'),
array('thtotal','thtotal)
)).'">%s </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?的主要内容,如果未能解决你的问题,请参考以下文章
如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别