我正在迭代一个包含超过3000个项目的数组 数组看起来像这样:
[
[
'id' => 1,
'type' => 'income'
'amount' => 10
],
[
'id' => 2,
'type' => 'expense',
'amount' => 20
],
.......
]
迭代时我调用操作同一类中另一个数组的函数 类似的东西:
$this->data->revenue->each(function($row) use($user)
{
if ($row->isIncome())
{
$this->addRevenueRowToColumn($row, 'income');
$this->addRevenueRowToColumn($row, 'total');
}
if ($row->isExpense())
{
$this->addRevenueRowToColumn($row, 'expense');
$this->subtractRevenueRowToColumn($row, 'total');
}
}
这就是函数的作用:
protected function addRevenueRowToColumn(&$row, $columnName)
{
$this->report['byMonth'][$row->getMonthTableKey()]['byDepartment'][$row->department_id][$columnName] += $row->amount;
$this->report['byMonth'][$row->getMonthTableKey()]['total'][$columnName] += $row->amount;
$this->report['totals']['byDepartment'][$row->department_id][$columnName] += $row->amount;
$this->report['totals']['total'][$columnName] += $row->amount;
}
protected function subtractRevenueRowToColumn(&$row, $columnName)
{
$this->report['byMonth'][$row->getMonthTableKey()]['byDepartment'][$row->department_id][$columnName] -= $row->amount;
$this->report['byMonth'][$row->getMonthTableKey()]['total'][$columnName] -= $row->amount;
$this->report['totals']['byDepartment'][$row->department_id][$columnName] -= $row->amount;
$this->report['totals']['total'][$columnName] -= $row->amount;
}
处理数据并显示它需要大约11秒
我该怎么办? 提前谢谢!
答案 0 :(得分:1)
加速php解决方案
除了建议使用数据库来组织你的东西,如果你仍然想要它的困难;)你可以通过使用下面的一个PHP函数避免迭代(让php做它internaly)整个数组:
array_map - 将回调应用于给定数组的元素
和
array_walk - 将用户函数应用于数组的每个成员
我在你的代码中看到你有'use'子句,所以我认为你是PHP> 5.3。在这种情况下,您可以执行以下操作:
$yourdata = array_map(
function($row) use ($user)
{
/*$user->doStuff();*/
return $row;
}, $yourdata
);
此外,很多开销是显示渲染部分。如果要显示很多内容,例如使用简单的回声,则更快:
$result = "";
$result .= $something;
$result .= $somethingelse;
echo $result;
大于
echo $something;
echo $somethingelse;
增强使用数据库的解决方案
但除此之外,如果您使用数据库肯定会有所帮助。最明显的是将数据存储在某些db表中,并使用一些sql-ish解决方案来查询它。它肯定会加速你的脚本。
加速db + php解决方案
接下来,通过以存储过程的形式在数据库引擎内完成大部分计算(业务逻辑),可以获得显着的性能提升。
例如,如果您使用mysql,则可以创建一个游标并在循环中迭代表行。在每一行上你都会做一些事情,而当然可以直接访问你的方案的所有表/列(以及可能的其他存储过程/函数)。如果你正在进行大量的数学计算,这是一个很好的解决方案,但是当然恕我直言,在SQL而不是PHP中编写你的东西通常不那么方便(更复杂);)