我正在迭代一个包含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秒
我该怎么办?提前感谢!
加速php专用解决方案
除了建议使用数据库来组织你的东西之外,如果你仍然想要它的话;)通过使用以下php函数之一,可以避免在整个数组上迭代(让php内部执行):
阵列映射--将回调应用于给定数组的元素
和
阵列行走--将用户功能应用于阵列的每个成员
我在你的代码中看到,你有"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;
增强使用数据库的解决方案
但除此之外,如果你使用数据库,肯定是有益的。最明显的是将数据存储在一些数据库表中,并使用一些sql-ish解决方案进行查询。这肯定会加快脚本的速度。
加速db+php解决方案
接下来,您可以通过在数据库引擎中以存储过程的形式进行大部分计算(业务逻辑)来大幅提高性能。
例如,如果使用mysql,可以创建一个游标,并在循环中迭代表行。在每一行上,您都要做一些事情,同时当然可以直接访问方案中的所有表/列(以及可能的其他存储过程/函数)。如果你正在做很多数学计算,这是一个很好的解决方案,但当然,IMHO,用SQL而不是PHP写东西通常不太方便(更复杂);)