【问题标题】:Check status == 1 or 0 from an array without PHP loop从没有 PHP 循环的数组中检查状态 == 1 或 0
【发布时间】:2014-02-07 15:47:50
【问题描述】:

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

【问题讨论】:

  • $the_query[0]['status'] ??
  • 现在无法测试,但您可以通过转换为 int 来对布尔数组求和吗?我在想 php 相当于 Matlab sum(myArray==value).
  • 另外 2 个查询,状态 == 1 和计数,状态 0 和计数。这是我没有循环解决方案的解决方案:),但循环是我认为最好的。

标签: php arrays wordpress


【解决方案1】:

在您的特定情况下使用循环是一个很好的解决方案。您应该避免在不必要的情况下使用循环,但这种特殊情况非常有意义。

您可能希望将查询返回的结果数限制为合理的数字(例如每页 10 或 15 个)。循环 10-15 个项目不会有太大的不同,特别是当您没有更好的方法来获得最终结果时。

当然,如果您不需要帖子中的所有数据(例如帖子的正文),那么还可以限制 SQL 返回的列数或根据您的要求构建更好的查询。

【讨论】:

  • 限制结果的数量不会给你一个完整和准确的计数。
【解决方案2】:

使用循环不会对您的资源造成太大影响。如果你试图检查一个数组的特定值,你将不得不使用一个循环。这不像你在解析大数据或任何东西,所以使用循环不会那么糟糕。这就是循环的用途。您要避免的是使用嵌套的 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;

与使用循环计数相比,这样做会占用更多资源,但这是一种选择。就个人而言,我只想循环当前数组。

【讨论】:

  • 执行多个查询对性能的影响比仅在一小部分数据上使用循环。
  • @LuckySoni 查询并不总是需要更长时间或更密集。如果您有一个索引数组和大量数据,则进行 2 次查询会更快。但是,对于一小组数据,是的,循环会更快。
【解决方案3】:

尝试使用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】:

同意其他回答,循环本身并不是坏事。在这种情况下,循环可能是获得所需内容的最简单方法。

有一些方法可以通过使用更实用的样式来避免循环,例如使用 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

【讨论】:

  • “虽然,这仍然会执行一个循环” - 所以对于“非活动”搜索,会有另一个潜在的循环,不是吗? :(
  • 如果“活动”和“不活动”是互斥的(似乎是),我会做$inactive = $total - $active;
【解决方案5】:

您可以直接使用 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>";
?>

希望对你有帮助

【讨论】:

  • 反对更多的 SQL 查询。 :(
猜你喜欢
  • 2015-02-16
  • 2020-05-06
  • 2018-05-22
  • 2019-05-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
相关资源
最近更新 更多