-4

我有一个数组列表,我需要对其应用一些逻辑,数组中的每个元素都引用我数据库中的一个类别。

到目前为止,我正在使用 foreach 循环中的计数来计算该类别在我的数据库中应用的次数。有没有办法把这个计数移到我的 foreach 循环之外?到目前为止,它的运行速度并不慢,基准为 0.00241899490356。

但我有超过 150 个类别,每个类别都循环并计数 6 次。我担心随着类别使用和数据库空间的增加,它会变得迟缓。我读到数据库操作不应该在循环中。在类似情况下,这种做法是否可行且可以原谅?

编辑 :: 我真的很抱歉我缺少代码。我通常先勾勒出问题,然后填上漏洞。我的时间用完了。不是马虎的借口,但这是我的借口。在阅读当前回复之前,我现在会修复。

    $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, hello, world 是您的类别。

您可以通过 2 种方式对此进行优化。

方法一

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

输出/输出

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

方法二

您可以为此使用数据库功能COUNT()

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

输出/输出

+--------+----------+
|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

您可以使用一些变量来存储每个类别的计数。然后您测试变量是否不为空,您将在其中获取值,否则您进行计数。

于 2013-01-08T15:20:36.687 回答