-4

いくつかのロジックを適用する必要がある配列のリストがあります。配列内の各要素は、データベース内のカテゴリを参照します。

これまでのところ、foreach ループ内のカウントを使用して、カテゴリがデータベースに適用された回数をカウントしています。このカウントを foreach ループの外に移動する方法はありますか? これまでのところ、実際にはまったく遅くはなく、0.00241899490356 でベンチマークされています。

しかし、150 を超えるカテゴリがあり、それぞれがループされて 6 回カウントされています。カテゴリの使用量とデータベース スペースが増えると、処理が遅くなるのではないかと心配しています。DB アクションはループにすべきではないことを読みました。これは、同様のシナリオで問題なく許される慣行ですか?

編集 :: コードが不足していることを本当にお詫び申し上げます。私は通常、最初に質問の概要を説明してから、穴を埋めます。私の時間がなくなった。ずさんになるための言い訳ではありませんが、それは私が持っているものです. 現在の返信を読む前に、今すぐ修正します。

    $nazioni = array(
        'ad' => array( 'eur', ),
        'ae' => array( 'asi', ),
        'af' => array( 'asi', ),
        'ag' => array( 'nam', ),
        'al' => array( 'eur', ),
        'am' => array( 'asi', 'eur', ),
        ...
        'za' => array( 'afr', ),
        'zm' => array( 'afr', ),
        'zw' => array( 'afr', ),
    );

    $categorie = array(
        'eur',
        'asi',
        'afr',
        'nam',
        'sam',
        'oce',
    );

    echo '<ul>';
    foreach($categorie as $cat)
    {
        echo '<li><a href="#">'.$cat.'</a></li>';
        echo '<ul>';
        foreach($nazioni as $n=>$c)
        {
            if(array_intersect(array($cat), $c) == true)
            {
                echo Filtra::uri_locale($n, $cat, $uri);
            }
        }
        echo '</ul>';
    }
    echo '</ul>';
}

カウントは Filtra::uri_locale アクションで行われます。

public static function uri_locale ($n, $cat, $uri)
{
    $count = DB::table('recipes')
    ->where(function($query)
    {
        $corso = Filtra::corso(explode("/", URI::current()));
        if(!empty($corso))
        {
            $query->where_in('course', $corso, 'OR');
        }
    })
    ->where('nation', '=', $n)->count();

    //if more than 0, or not empty and in the uri array.
    if($count > 0 || !empty($uri) && array_intersect(array($n), $uri))
    {
        return self::uri_href($uri, $n, $count);
        // ex: returns a link named Italy (3) if Italy has 3 results counted.
    }
}

私が調べている関連データベーステーブル:

| id | title | nation | course |
————————————————————————————————
| 1  | Pizza | it     | 4      |

それはイタリアに翻訳され、コースは、同様のロジック、同じ問題に対する同じ解決策を使用する分類の別のレイヤーに使用されます。

繰り返しますが、この取り違えについて本当に申し訳ありません。頭と期限を大幅に超えています。

4

3 に答える 3

2

PHPコードまたはデータベースに関する情報を提供していないため、いくつかの仮定と回答をさせてください。1、こんにちは、世界があなたのカテゴリーであると仮定しましょう。

これは 2 つの方法で最適化できます。

方法 1

<?php
$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values($array));
?>

O/P

Array
(
    [1] => 2
    [hello] => 2
    [world] => 1
)

方法 2

これにはデータベース機能COUNT()を使用できます。

SELECT category, COUNT(*) FROM category_table GROUP BY category;

O/P

+--------+----------+
|category| COUNT(*) |
+--------+----------+
| 1      |        2 |
| hello  |        2 |
| world  |        1 |
+--------+----------+

問題がある場合はお知らせください

于 2013-01-08T15:20:40.877 に答える
1

おそらく、MySQL にカウントを行わせる方がよいでしょう。こちらをご覧ください: https://dev.mysql.com/doc/refman/5.1/en/counting-rows.htmlそうすれば、「転送」する必要はありません。すべてのデータを PHP に送信し、そこでカウントを行います。

于 2013-01-08T15:08:28.733 に答える
0

各カテゴリのカウントを格納するいくつかの変数を使用できます。次に、変数がnullでないかどうかをテストし、値を取得します。それ以外の場合は、カウントを行います。

于 2013-01-08T15:20:36.687 に答える