我有一个数组列表,我需要应用一些逻辑,数组中的每个元素都指向我数据库中的一个类别。
到目前为止,我正在计算使用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 |
它被翻译成意大利,当然用于另一层分类,它使用类似的逻辑,同样解决同一问题。
再一次,对于这个混音非常抱歉,我已经超越了我的头脑和截止日期。
答案 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)
您可以使用一些存储每个类别的计数的变量。然后你测试变量是否为空,你取其中的值,否则你进行计数。