【问题标题】:How do I track cardinality in a for loop?如何在 for 循环中跟踪基数?
【发布时间】:2013-02-08 22:41:22
【问题描述】:

我有一个元素数组,每个元素都有 1 或 0。我想遍历每个元素并计算哪些元素的 1 最多。

所以我有三个字段:

id、question 和 yesno

值如下所示:

1,1,0
1,2,0
1,3,1
1,4,0
1,5,1
2,1,0
2,2,1
2,3,1
2,4,0
2,5,1
3,1,0
3,2,1
3,3,1
3,4,0
3,5,1

这就是它的要点。现在,我想计算中间列中的哪些元素,第三列中的 1 最多。换一种方式来解释。我想遍历 for 循环并计算中间数字是“1”的次数。稍后,我将排序找出哪个最多。如何进行这种类型的迭代?

如有混淆请提出问题!我自己也糊涂了……!

【问题讨论】:

  • 计算中间栏为“1”的次数后你想要什么?
  • 基本上,我想弄清楚中间的哪一列是“1”最多。如果您注意到,中间的列循环为 12345、12345、12345。换句话说,如果您查看字段名称,则会出现问题(中间列)和是/否(由 1 或 0 表示)。我想找出哪些问题是“是”的最多。意思是,12345 中,哪一个的 1 最多。
  • 我添加了一张图片,应该会有帮助
  • 我已经为你添加了mysql标签,因为它看起来像phpMyAdmin界面:)
  • 所以您的数据在数据库中?如果是这样,请编辑您的问题并将此相关信息添加到其中。这样看起来你的数据是先验的 PHP 数组。

标签: php mysql arrays for-loop


【解决方案1】:

如果这是在数据库中,您可以使用以下 SQL:

SELECT question_id, SUM(value = 1) AS value
FROM mytable
GROUP BY question_id
ORDER BY value DESC
LIMIT 1;
  1. SUM(value = 1) 计数每个 yesno 值等于 1 的出现次数;
  2. 使用 GROUP BY question_id 计算每个问题的 #1
  3. 然后根据出现次数降序排列(第一个是最高的)
  4. 拿走第一项。

【讨论】:

  • 您介意解释一下吗?它是如何工作的?而且,这会是最好的方法吗?而不是运行一个 php for 循环?
  • @DanielFein 是的,数据库操作在数据库中比在 PHP 中完成的要好得多,只要合理可行 ;)
  • 这看起来很聪明!谢谢!您如何将其写为查询字符串?我可以把它放在一行中吗?
  • @DanielFein 您可以在 phpMyAdmin 中运行它并检查结果。
  • @DanielFein 是的,MySQL 查询中的空格无关紧要。
【解决方案2】:

如果您仍然喜欢使用 PHP:

$counts=array();
foreach($arr as $v) @$counts[$v['movie_id']]+=$v['value'];

我们创建一个空数组,然后将$v['value']添加到该数组中键为$v['movie_id']的项目中。如果该键尚不存在,则会使用值0 创建它,并且根据您的 PHP 设置,会显示一条通知。放置在 PHP 命令前面的 at-sign @ 会抑制该行中生成的通知和警告。

【讨论】:

  • 这会返回什么?我以前从未见过@ 符号或这样的双括号。
  • 已编辑。更好的?是的,不存在“双括号”,它们只是彼此相邻的两个“单括号”。
  • 是的,谢谢,为了清楚起见,我应该用 question_id 替换 movie_id 吗?
  • 你想要被投票的东西,也就是说,如果人们投票给电影并且你想要挑选最好的电影,你想要movie_id
猜你喜欢
  • 2020-10-02
  • 2015-09-10
  • 2015-07-11
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
相关资源
最近更新 更多