3

私のコードはarray_walkで配列をループしており、その配列には約10.000個のアイテムが含まれています。クエリはレコードをフェッチするのに 5.19 秒かかりますが、配列をウォークスルーするには 19.86 秒かかります。物事をスピードアップするために私にできることはおそらくありませんか?

質問は json で返され、テーブルを作成するために jquery dataTables プラグインによって使用されます。プラグインは、それほど多くのエントリに問題があるようには見えません (少なくとも Firefox では)。

laravel フレームワークを使用しています。以下のコントローラーコードを参照してください

$start = microtime(true);
$questions = Question::with(array('tags', 'category'))->get();
$now = microtime(true) - $start;
echo "<h3>FETCHED QUESTIONS: $now</h3>";
array_walk($questions, function(&$value, $key) {
    $value = $value->to_array();
    if (empty($value['category'])) $value['category'] = '--';
    if (empty($value['difficulty'])) $value['difficulty'] = '--';
    $value['difficulty'] = HTML::difficulty_label($value['difficulty']);
    $value['approved'] = HTML::on_off_images($value['approved'], 'approved', 'declined');
    $value['active'] = HTML::on_off_images($value['active'], 'active', 'disabled');
    $value['edit_link'] = '<a href="' . URL::to('admin/editquestion/' . $value['id']) . '">' . HTML::image('img/icons/pencil.png', 'edit question') ; '</a>';
});

$spent = microtime(true) - $start - $now;
$now = microtime(true) - $start;
echo "<h3>AFTER WALK: $now ($spent)</h3>";
$out = array('aaData' => $questions);
return json_encode($out);
4

1 に答える 1

2

foreach10000回の関数呼び出しを行うというペナルティを回避するために、自分で配列をループするだけです:

foreach($questions as &$value) {
    $value = $value->to_array();
    if (empty($value['category'])) $value['category'] = '--';
    if (empty($value['difficulty'])) $value['difficulty'] = '--';
    $value['difficulty'] = HTML::difficulty_label($value['difficulty']);
    $value['approved'] = HTML::on_off_images($value['approved'], 'approved', 'declined');
    $value['active'] = HTML::on_off_images($value['active'], 'active', 'disabled');
    $value['edit_link'] = '<a href="' . URL::to('admin/editquestion/' . $value['id']) . '">' . HTML::image('img/icons/pencil.png', 'edit question') ; '</a>';
}
于 2012-10-15T17:07:00.440 に答える