【问题标题】:Grouped alternating row colors with a variation具有变化的分组交替行颜色
【发布时间】:2017-06-04 03:47:48
【问题描述】:

这是一个简单的逻辑问题,但我有一个心理障碍。我有如下的行组:

注意以下几点:

  • 第 1 组有 2 条记录
  • 第 2 组有 2 条记录
  • 第 3 组有 1 条记录
  • 第 4 组有 2 条记录
  • 第 5 组有 1 条记录
  • 第 6 组有 2 条记录

我希望每个组中的每条记录都具有与组中其他记录相同的背景颜色,但与之后的下一个分组具有不同的背景颜色。所以,我想要实现的是:

  • 第 1 组中的两条记录都应具有白色背景色。
  • 第 2 组中的两条记录都应具有灰色背景色。
  • 第 3 组中的唯一记录应具有白色背景色。
  • 第 4 组中的两条记录都应具有灰色背景色。

...等等。因此,我希望每组的 bgcolor 交替,而不是每条记录的 bgcolor 交替的典型交替行颜色,而每组内的颜色保持一致。

我目前的逻辑是这样的:

if($gameID != $previousGameID)
    $rowColor = "#ffffff";
else
    $rowColor = "#F0F0F0";

虽然该代码是 PHP,但这个问题并不是 PHP 独有的,它只是一个逻辑问题,这就是为什么我用 PHP、C# 和 JS(我知道的 3 种语言)标记这个问题的原因。我上面的代码是错误的,因为它导致每条记录的背景颜色发生变化,而不是每组记录。每个组中的记录具有相同的游戏 ID,并且该游戏 ID 将与所有其他组不同。所以gameID是解决这个小谜题的关键部分,但我无法理解解决方案。

注意:您不能假设每个分组都有 1 条或 2 条记录。尽管我的示例没有显示,但在极少数情况下,一个组中会有 3 条记录(在这种情况下,所有 3 条记录都将具有相同的游戏 ID)。

有什么想法吗?

【问题讨论】:

    标签: javascript c# php logic


    【解决方案1】:

    当前逻辑的问题是您总是更改$rowColor,即使gameID 没有更改。

    创建一个alternateColor() 函数,调用该函数时,将$rowColor 在灰色和白色之间更改。

    然后将您的条件更新为

    if($gameID != $previousGameID)
        alternateColor();
    

    然后使用更新后的$rowColor

    此解决方案适用于任何类型的 ID(数字、字符串等)。一个简单的情况是数字顺序 ID,即:1、2、3 等。在这种情况下,逻辑可能是:

    if ($gameID % 2 == 0)
        $rowColor = "#ffffff";
    else
        $rowColor = "#F0F0F0";
    

    也就是说,根据一个ID是奇数还是偶数,选择相应的颜色。

    更新

    关于顺序 ID,我并没有暗示您的 ID 是顺序的。我暗示 if 他们是,比模数解决方案就足够了。 alternateColor() 函数方法适用于任何类型的 ID。

    作为alternateColor() 的示例,请考虑以下(C#):

    在您的逻辑所在的类中,创建一个实例方法 AlternateColor 并确保您的 rowColor 变量是实例级变量:

    private string rowColor == "#ffffff"; // let's start with white
    
    private void AlternateColor()
    {
        this.currentColor = this.currentColor == "#ffffff" ? "#F0F0F0" : "#ffffff";
    }
    

    现在每次调用AlternateColor 时,它都会在两种颜色之间交替rowColor。这是在当前gameID 更改时完成的。

    更新 2

    不确定以下PHP的正确性,但你应该明白了:

    class Games {
      private var $rowColor;
    
      private function alternateColor(){
         $this->$rowColor = ($this->$rowColor == "#ffffff" ? "#F0F0F0" : "#ffffff");
      }
    
      public function theFuncWhereYouOutputTheTable(){
         ...
    
         if($gameID != $previousGameID)
             $this->alternateColor();
    
         // use $rowColor afterwards
         ...
      }
    
    }
    

    【讨论】:

    • 我没有关注。 gameID 很少按顺序排列,有时它们之间会有间隔。他们在一个组中总是相同的,但仅此而已。我并不是要在我的屏幕截图中暗示 1、2、3、4、5、6 是游戏 ID——它们不是。我只是想说明存在分组。你能给我一个你的alternateColor() 函数代码的例子,以及将要传入的参数吗?谢谢!
    • 是的,非常感谢您的澄清回复。尽管我仍然感到困惑,为什么在函数中进行切换(将颜色视为全局)与内联进行有什么不同,条件是 gameid 检查。显然你的方法有效而我的方法无效,但我仍然不明白为什么。
    • 不客气。至于为什么会有所不同,并详细说明我的答案的第一行,正确的逻辑是如果gameID发生变化,则使用不同的颜色,否则继续使用当前颜色,而您的逻辑是had是如果gameID改变,则使用一种颜色,否则使用另一种颜色。换句话说,如果你的小组有 3 场或更多场比赛,你会看到第一场比赛有一种颜色,而组中的所有其他人都有另一种颜色。
    【解决方案2】:

    设置一个全局变量来存储第一种颜色,比如 $rowColor="#ffffff"。 然后在循环中

    if($gameId != $previousGameId)
    {
        alternateColor();
    }
    

    然后定义,

    function alternate()
    {
        if($rowColor== "#ffffff")
        {
             $rowColor= "#FOFOFO";
        }
        else
        {
             $rowColor= "$ffffff";
        }
    }
    

    这应该有效!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多