从没有PHP循环的数组中检查状态== 1或0

时间:2014-01-18 06:05:06

标签: php arrays wordpress

对于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。

5 个答案:

答案 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>";
?>

希望有所帮助