PHP|迭代时通过函数更新数组项-性能问题很大


PHP | Updating array items through function while iterating - Big performance issue

我正在迭代一个包含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写东西通常不太方便(更复杂);)