将count()移到foreach循环之外

时间:2013-01-08 15:01:08

标签: php mysql count laravel

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

到目前为止,我正在计算使用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      |

它被翻译成意大利,当然用于另一层分类,它使用类似的逻辑,同样解决同一问题。

再一次,对于这个混音非常抱歉,我已经超越了我的头脑和截止日期。

3 个答案:

答案 0 :(得分:2)

由于您没有提供有关PHP代码或数据库的任何信息,请允许我做一些假设和回答。让我们假设1,你好,世界是你的类别。

您可以通过两种方式对其进行优化。

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

如果您有任何问题,请告诉我

答案 1 :(得分:1)

让MySQL进行计数可能会更好,请看这里:https://dev.mysql.com/doc/refman/5.1/en/counting-rows.html然后你不必将所有数据“传输”到PHP并在那里进行计数。

答案 2 :(得分:0)

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