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 関数の 1 つを使用して、配列全体の反復処理 (php に内部処理を任せる) を避けることができます。下:

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 っぽいソリューションを使用してクエリを実行することです。それは確かにあなたのスクリプトをスピードアップします。

db+php ソリューションをスピードアップ
次に、ほとんどの計算 (ビジネス ロジック) をデータベース エンジン内でストアド プロシージャの形式で実行することにより、パフォーマンスを大幅に向上させることができます。

たとえば、mysql を使用する場合は、カーソルを作成して、テーブルの行をループで反復処理できます。もちろん、スキームのすべてのテーブル/列(およびおそらく他のストアドプロシージャ/関数)に直接アクセスしながら、すべての行でいくつかのことを行います。多くの数学的な計算を行っている場合、それは素晴らしい解決策ですが、もちろん私見では、通常、PHP ではなく SQL で記述した方が便利ではありません (より洗練されています) ;)

于 2013-08-08T11:31:04.727 に答える