2

我正在迭代一个包含 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 秒

我应该怎么办?提前致谢!

4

1 回答 1

1

加速 php 唯一解决方案
除了建议使用数据库来组织你的东西,如果你仍然想要它,你可以通过使用其中一个 php 函数来避免迭代(让 php 在内部进行)整个数组以下:

array_map — 将回调应用于给定数组的元素

array_walk — 将用户函数应用于数组的每个成员

我在你的代码中看到,你有'use'子句,所以我认为你是 PH​​P > 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,您可以创建一个游标并在循环中迭代您的表行。在每一行上你都做一些事情,当然可以直接访问你的方案的所有表/列(可能还有其他存储过程/函数)。如果你正在做很多数学计算,这是一个很好的解决方案,但是恕我直言,用 SQL 而不是 PHP 编写你的东西通常不太方便(更复杂);)

于 2013-08-08T11:31:04.727 回答