草庐IT

php - 计算模式中多个列中项目的不同出现次数

coder 2023-10-26 原文

我正在使用 MySql 和 PHP 开发一个调查应用程序 响应将采用以下格式:

+-c1_1-+-c1_2-+-c1_3-+-c1_1-+-c1_2-+-c1_3-+-....
+ red  + blue + pink + cyan + red  + gray + ....
+ black+ pink + plum + red  + blue + gray + ....
+ cyan + red  + blue + blue + pink + plum + ....
+------+------+------+------+------+------+ ....
  • c1_1 代表 Column_For_Question_1_With_Rank_1
  • c1_2 代表 Column_For_Question_1_With_Rank_2
  • c1_3 代表 Column_For_Question_1_With_Rank_3
  • c2_1 代表 Column_For_Question_2_With_Rank_1
  • c2_2 代表 Column_For_Question_2_With_Rank_2
  • c2_3 代表 Column_For_Question_2_With_Rank_3

评分是这样的:

  • 排名 1 = cX_1 列中的颜色 = 获得 3 分(c1_1、c2_1、c3_1..)
  • 排名 2 = cX_2 列中的颜色 = 获得 2 分(c1_2、c2_2、c3_2..)
  • 排名 3 = cX_3 列中的颜色 = 获得 1 分(c1_3、c2_3、c3_3..)

红色分数:

  • 出现在 cX_1 两次 = 3x2=6
  • 出现在 cX_2 两次 = 2x2=4
  • 所以红色的得分为 6+4=10

蓝色分数:

  • 在 cX_1 中出现一次 = 3x1=3
  • 出现在 cX_2 两次 = 2x2=4
  • 在 cX_3 中出现两次 = 1x2=2
  • 所以蓝色的得分为 3+4+2 = 9

是否可以编写一个有效的查询来获得如下结果:

+-color-+-score-+
+  red  +  10   +
+ blue  +   9   +
+  xxx  +   #   +
+  xxx  +   #   +
+  xxx  +   #   +
+-------+-------+

如果那不可能,至少出现的次数如下:

+-color-+-n_cX_1-+-n_cX_2-+-n_cX_3-+
+  red  +   2    +   2    +   0    +
+ blue  +   1    +   2    +   2    +
+  xxx  +   #    +   #    +   #    +
+  xxx  +   #    +   #    +   #    +
+  xxx  +   #    +   #    +   #    +
+  xxx  +   #    +   #    +   #    +
+-------+--------+--------+--------+

实际上颜色会被人名代替。

每组“连续三列”(cX_1、cX_2、cX_3)代表 9 个问题中每个问题的第一、第二和第三等级。所以会有3x9=27列

有人可以帮我解决这个问题吗?我正在考虑反复使用 count(*) 但我确信这是一种错误的方法。发帖前查了很多都没有解决。

编辑 1: 想提一下,这些列中可能有将近 50 个人的名字。每行代表一位调查员的回答。大约有 100 名这样的审查员,因此大约有 100 行。

最佳答案

这是我的解决方案,我比较喜欢用 PHP,所以我的答案是在 PHP 方面,如果你想要 SQL 解决方案,你应该等待一段时间让另一个用户添加 SQL 方面的解决方案,

您将从 MySQL 中获取这种 PHP 数组,

$result = [
    'c1_1'=>['red','black','cyan'],
    'c1_2'=>['blue','pink','red'],
    'c1_3'=>['pink','plum','blue'],
    'c2_1'=>['cyan','red','blue'],
    'c2_2'=>['red','blue','pink'],
    'c2_3'=>['gray','gray','plum']
];

现在,生成一个用户数组,其中包含每个用户在每个类别中的成就,

$users = [];

foreach($result as $k => $v)
{
    foreach($v as $user)
    {
        $users[$user][] = $k;
    }
}

现在,$users 数组看起来像,

array (size=7)
  'red' => 
    array (size=4)
      0 => string 'c1_1' (length=4)
      1 => string 'c1_2' (length=4)
      2 => string 'c2_1' (length=4)
      3 => string 'c2_2' (length=4)
  'black' => 
    array (size=1)
      0 => string 'c1_1' (length=4)
  'cyan' => 
    array (size=2)
      0 => string 'c1_1' (length=4)
      1 => string 'c2_1' (length=4)
  'blue' => 
    array (size=4)
      0 => string 'c1_2' (length=4)
      1 => string 'c1_3' (length=4)
      2 => string 'c2_1' (length=4)
      3 => string 'c2_2' (length=4)
  'pink' => 
    array (size=3)
      0 => string 'c1_2' (length=4)
      1 => string 'c1_3' (length=4)
      2 => string 'c2_2' (length=4)
  'plum' => 
    array (size=2)
      0 => string 'c1_3' (length=4)
      1 => string 'c2_3' (length=4)
  'gray' => 
    array (size=2)
      0 => string 'c2_3' (length=4)
      1 => string 'c2_3' (length=4)

现在,定义一个函数来计算分数,通过我们刚刚生成的用户传递数组,

function marks_of($input)
{
    $marks_index = ['_1'=>3, '_2'=>2, '_3'=>1]; // define marks here
    $marks = 0;
    foreach($input as $marking)
    {
        $marks += $marks_index[substr($marking, -2)];
    }
    return $marks;
}

您需要按照我在上面代码中的注释在每个类别中定义标记。

现在,像这样使用它,

$marks_of_red = marks_of($users['red']);

会给予

int 10

要生成一个数组,其中包含每个用户的名称标记,

$all_users_marks = [];

foreach($users as $name => $achievements)
{
    $all_users_marks[$name] = marks_of($users[$name]);
}

现在,$all_users_marks

array (size=7)
  'red' => int 10
  'black' => int 3
  'cyan' => int 6
  'blue' => int 8
  'pink' => int 5
  'plum' => int 2
  'gray' => int 2

正如我已经说过的,如果你想要 MySQL 方面的答案,请等待某人。

关于php - 计算模式中多个列中项目的不同出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31318845/

有关php - 计算模式中多个列中项目的不同出现次数的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  6. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  7. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  8. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  9. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  10. ruby - 使用多个数组创建计数 - 2

    我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

随机推荐