对于WordPress插件,我使用简单的$wpdb
查询,如:
global $wpdb;
$table = $wpdb->wp_table_name = $wpdb->prefix . "wp_table_name";
$the_query = $wpdb->get_results(
"SELECT *
FROM $table;
");
它给出了数组(使用var_dump()
):
array
0 =>
object(stdClass)[342]
public 'id' => string '1' (length=1)
public 'name' => string 'The Name' (length=8)
public 'status' => string '1' (length=1)
1 =>
object(stdClass)[341]
public 'id' => string '2' (length=1)
public 'name' => string 'The Name 2' (length=10)
public 'status' => string '0' (length=1)
在视图列表中,我想显示一个简单的计数器,如:
Total: 2; Active: 1; Inactive: 1
对于总数,我使用了一个简单的count()
:
<?php echo count($the_query); ?>
工作正常。现在我想显示其他两个数字,但[如果可能] 没有任何循环。
我想使用很多循环可能会减慢页面速度。我搜索了很多,他们建议in_array()
或array_key_exists()
。但他们似乎在搜索索引,他们无法检查它是==
1还是0。
答案 0 :(得分:3)
在特定情况下使用循环是一个很好的解决方案。你应该避免在没有必要的情况下使用循环,但这种特殊情况非常有意义。
您可能希望将查询返回的结果数限制为合理的数字(例如每页10或15)。循环超过10-15个项目不会产生太大影响,特别是当您没有更好的方法来获得最终结果时。
当然,如果您不需要帖子中的所有数据(如帖子的正文),那么还可以根据您的要求限制SQL或框架返回的列数更好的查询。
答案 1 :(得分:2)
同意其他响应,循环本身并不坏。在这种情况下,循环可能是获得你所追求的最简单的方法。
有一些方法可以通过使用更实用的样式来避免循环,例如使用array_reduce。例如
$active = array_reduce($the_query, function ($result, $item) {
if ($item->status === '1') {
return $result + 1;
}
return $result;
});
var_dump($active);
尽管如此,这仍然会执行一个循环,但它被抽象出底层的C实现。
这是否是性能提升,我不确定(我怀疑不是)。您必须分析您的代码。这主要是一种风格选择。
以下是该示例工作的键盘:http://codepad.viper-7.com/JFzUga
答案 2 :(得分:0)
使用循环不会对您的资源造成严重影响。如果您尝试检查数组中的特定值,则必须使用循环。它不像你正在解析大数据或任何东西,所以使用循环不会那么糟糕。这就是循环的用途。您要避免使用嵌套for循环或嵌套循环。对于你想要做的事情,循环很好。
循环是编码的基本构建块。你想要避免的是嵌套循环并在循环内循环循环。使用单个循环的运行时间为(O)n。当您开始嵌套循环时,您会以指数方式增长。嵌套的for循环将是(O)n ^ 2,3个嵌套循环将是(O)n ^ 3,依此类推。这就是它变坏的地方。所以不要害怕使用带数组的循环。
然而,一种方法是,如果您真的不想使用循环,那么可以再进行2次查询,其中您可以使用活动/非活动条目的数量。
这可能如下所示:
SELECT COUNT(*) FROM $table WHERE status = 1;
SELECT COUNT(*) FROM $table WHERE status = 0;
对于使用循环计数的资源,这样做会更加密集,但这是一个选项。就个人而言,我只是循环遍历当前数组。
答案 3 :(得分:0)
尝试使用SUM()
SELECT COUNT( id ) AS total, SUM( IF(status =1, 1, 0 ) ) AS active,
SUM( IF(status =0, 1, 0 ) ) AS inactive
FROM $table
答案 4 :(得分:0)
您可以直接使用 get_var 而不是 get_results
<?php
$active_user_count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users where status=1");
echo "<p>Active user count is {$active_user_count}</p>";
$inactive_user_count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users where status=0");
echo "<p>Inactive user count is {$inactive_user_count}</p>";
?>
希望有所帮助